Difference between revisions of "Change log/5.26"
Jump to navigation
Jump to search
(Updated to build 15607143.) |
(Updated to build 16515710.) |
||
(3 intermediate revisions by the same user not shown) | |||
Line 6: | Line 6: | ||
* Major overhaul to heavy weapons grunts. | * Major overhaul to heavy weapons grunts. | ||
* Major overhaul to third person camera. | * Major overhaul to third person camera. | ||
− | * New | + | * New "trigger_observer" script entity. |
− | * New | + | * New "func_vehicle" native entity. |
* Players can now be voice muted without having to block text chat too. | * Players can now be voice muted without having to block text chat too. | ||
* Significant quality of life updates to Svencraft map editor. | * Significant quality of life updates to Svencraft map editor. | ||
Line 15: | Line 15: | ||
=== Game library === | === Game library === | ||
− | * Added cheat command | + | * Added cheat command "entityinfo": |
− | ** Works the same as | + | ** Works the same as "myinfo" and "thatinfo", but expects either target name or entity index afterwards. |
− | ** For entity index queries prefix the number with a hash '#'. (For example | + | ** For entity index queries prefix the number with a hash '#'. (For example "#50" for entity index 50.) |
** This will print entity information for all entities found with the specified target name, or just the one at the entity index. | ** This will print entity information for all entities found with the specified target name, or just the one at the entity index. | ||
* Added colours cyan, green, magenta, and orange to the text menu. | * Added colours cyan, green, magenta, and orange to the text menu. | ||
* Added graceful error message when a null entity or class name empty entity is spawned. | * Added graceful error message when a null entity or class name empty entity is spawned. | ||
− | * Added player command | + | * Added player command "hud_reset" so they have a way to try and work around the uninitialised HUD when joining. (Subject to the player command retry limit to avoid flooding.) |
− | * Added server command | + | * Added server command "as_plugins", a server console equivalent to client command "as_listplugins". (They couldn't have the same name.) |
− | * Added server command | + | * Added server command "showmapvotelist" to see what maps can be voted for. |
* Adjusted the default bounding box size for battery and inventory item entities to make them less likely to disappear into walls. | * Adjusted the default bounding box size for battery and inventory item entities to make them less likely to disappear into walls. | ||
* All entities will now preserve their original rendering properties (mode, amount, colour, and effect) during the pre-spawn function instead of just players and particular NPC entities. | * All entities will now preserve their original rendering properties (mode, amount, colour, and effect) during the pre-spawn function instead of just players and particular NPC entities. | ||
− | * Allow | + | * Allow "mp_footsteps" to be set by map config files. |
* ambient_music: | * ambient_music: | ||
** Added support for explicit use types for activator-only mode music. | ** Added support for explicit use types for activator-only mode music. | ||
** Better notice of being explicitly turned on/off instead of toggle only for everyone music. | ** Better notice of being explicitly turned on/off instead of toggle only for everyone music. | ||
− | ** Use type | + | ** Use type "SET" will accept the float value to start playing from an exact offset. |
* Ammo entities: Reduced default size to match small items (such as batteries) allowing them more room before being declared to be stuck in the wall. | * Ammo entities: Reduced default size to match small items (such as batteries) allowing them more room before being declared to be stuck in the wall. | ||
* Beams & lasers: | * Beams & lasers: | ||
− | ** Added explicit use type support to | + | ** Added explicit use type support to "env_laser". |
** Do not apply damage taking shake effect to players if the beam/laser does zero damage. | ** Do not apply damage taking shake effect to players if the beam/laser does zero damage. | ||
− | * Blocking doors, platforms, rotating, and train entities with zero crush damage no longer tries to inflict zero damage on the blocker. ( | + | * Blocking doors, platforms, rotating, and train entities with zero crush damage no longer tries to inflict zero damage on the blocker. ("TakeDamage" function won't be called.) |
− | * Blocking doors, platforms, rotating, and train entities with negative crush damage will call a | + | * Blocking doors, platforms, rotating, and train entities with negative crush damage will call a "TakeHealth" function instead of "TakeDamage". |
* Breakable entities will store the damage inflictor in entvars `pev->dmg_inflictor`. | * Breakable entities will store the damage inflictor in entvars `pev->dmg_inflictor`. | ||
− | * Brought back borderless window option | + | * Brought back borderless window option "r_borderless", which works with SDL instead of Windows API. |
** If this option is enabled [1] and the window size matches the screen resolution the window will become borderless. | ** If this option is enabled [1] and the window size matches the screen resolution the window will become borderless. | ||
** Removes the bottom rounded corners exposing the task bar colour on Windows 11. | ** Removes the bottom rounded corners exposing the task bar colour on Windows 11. | ||
− | * cl_showstats: The client and server address have been flipped when running a listen server, because the engine reports | + | * cl_showstats: The client and server address have been flipped when running a listen server, because the engine reports "local_address" as the server socket instead of the client socket. |
* Cross-map inventory will now work with LAN players by tracking them using their IP address and port number: This should fix players losing their cross-map inventory in LAN games if the player needed to disconnect to retrieve content, particularly via HTTP, but only if the client doesn't change their outbound port number. (Usually true in LAN games as there is no P-NAT between the client and server randomising this.) | * Cross-map inventory will now work with LAN players by tracking them using their IP address and port number: This should fix players losing their cross-map inventory in LAN games if the player needed to disconnect to retrieve content, particularly via HTTP, but only if the client doesn't change their outbound port number. (Usually true in LAN games as there is no P-NAT between the client and server randomising this.) | ||
* dropitem command: Fixed pointer corruption when dropping an item while holding multiple items. | * dropitem command: Fixed pointer corruption when dropping an item while holding multiple items. | ||
* env_fade/env_message: Pass the original activator to `SUB_UseTargets()` instead of itself. | * env_fade/env_message: Pass the original activator to `SUB_UseTargets()` instead of itself. | ||
− | * env_glow/env_sprite: Implemented | + | * env_glow/env_sprite: Implemented "framestart" key. |
* env_spark: Obey explicit trigger use types when the toggle flag is enabled. | * env_spark: Obey explicit trigger use types when the toggle flag is enabled. | ||
* Fixed a (rare) crash when a base entity has no entvars `pev`, but its class name or target name is asked for. | * Fixed a (rare) crash when a base entity has no entvars `pev`, but its class name or target name is asked for. | ||
Line 55: | Line 55: | ||
* Fixed armor HUD not disappearing when entering in observer mode. | * Fixed armor HUD not disappearing when entering in observer mode. | ||
* Fixed button sparks appearing in the centre of the world instead of where the button is. | * Fixed button sparks appearing in the centre of the world instead of where the button is. | ||
− | * Fixed entities with a | + | * Fixed entities with a "keep activator" flag active not working as expected if the original activator was not a player, and the entity had a delayed activation. (Such as a "trigger_relay".) |
* Fixed incorrect deploy method calls and ensure proper sentry deployment behaviour. | * Fixed incorrect deploy method calls and ensure proper sentry deployment behaviour. | ||
* Fixed issue preventing upward-facing players from ascending ladders. (On-ground check was aggressively setting the player's origin to the floor, even if they were on a ladder.) | * Fixed issue preventing upward-facing players from ascending ladders. (On-ground check was aggressively setting the player's origin to the floor, even if they were on a ladder.) | ||
− | * Fixed Opposing Force mortar controller unintentionally modifying non- | + | * Fixed Opposing Force mortar controller unintentionally modifying non-"op4mortar" entities during its set-up. |
* Fixed respawning pick-up entities (such as ammo) not retaining their original render amount and render mode properties. | * Fixed respawning pick-up entities (such as ammo) not retaining their original render amount and render mode properties. | ||
* Fixed some crashes caused by uninitialized variables or division by zero in HUD messages. | * Fixed some crashes caused by uninitialized variables or division by zero in HUD messages. | ||
− | * Fixed negative numbers not passing the | + | * Fixed negative numbers not passing the "Is String a 3D Vector" test. |
* Fixed spore grenade using the wrong hull. (It should be point size.) | * Fixed spore grenade using the wrong hull. (It should be point size.) | ||
+ | * Fixed studio model box calculations. | ||
* Fixed player spawn point selector not guaranteeing an empty spawn point when one is available. | * Fixed player spawn point selector not guaranteeing an empty spawn point when one is available. | ||
* Fixed players taking damage (including death) from fall damage when god mode is on. | * Fixed players taking damage (including death) from fall damage when god mode is on. | ||
* Fixed pre-caching of sky maps adding corrupted resources to the pre-cache list. | * Fixed pre-caching of sky maps adding corrupted resources to the pre-cache list. | ||
− | * Fixed unintentional | + | * Fixed unintentional "click" action when releasing the scoreboard after clicking the mouse. (Often caused unintended weapon firing.) |
* Fixed visual disturbance when switching quickly between first and third person. | * Fixed visual disturbance when switching quickly between first and third person. | ||
+ | * func_camera/func_mirror/func_portal: | ||
+ | ** Fixed regression with portals not rendering player model while in first person. (If portals are currently being rendered, skip the player model draw bypass check.) | ||
+ | ** Fixed rendering never working when a minimum or maximum distance is specified. (If the entity is brush based it will still need an origin brush attached to the model.) | ||
+ | ** Spawn flag "SF_PORTAL_SHOOT_THROUGH" now only applies to portals. (Not cameras or mirrors.) | ||
* func_clip/func_monsterclip: | * func_clip/func_monsterclip: | ||
** Added support for SET and KILL use types. | ** Added support for SET and KILL use types. | ||
− | ** Apply the FL_MONSTERCLIP flag if the SF_MONSTERS spawn flag is defined. (Not just if the entity class name is | + | ** Apply the FL_MONSTERCLIP flag if the SF_MONSTERS spawn flag is defined. (Not just if the entity class name is "func_monsterclip".) |
− | ** Fixed the | + | ** Fixed the "start off" flag not working. |
* func_guntarget: Change classification to none from machine so that NPCs ignore it by default, though also support mappers choosing a classification of their choice. | * func_guntarget: Change classification to none from machine so that NPCs ignore it by default, though also support mappers choosing a classification of their choice. | ||
* func_pushable: | * func_pushable: | ||
− | ** Restored legacy | + | ** Restored legacy "size" key specifically for older maps that use it if they don't have a compiled hull size. (E.g. for aligning the focuser emitters in Half-Life: Blue Shift.) |
** Added logic to select the hull alignment method. | ** Added logic to select the hull alignment method. | ||
− | ** Mappers can now specify | + | ** Mappers can now specify "SOLID_BSP" solid type for more precise collision rather than "SOLID_BBOX"'s generic bounding box collision. |
** Updated push calculations: Checks if the goal move velocity length is zero before proceeding, and also ensures the velocity does not exceed the maximum speed. | ** Updated push calculations: Checks if the goal move velocity length is zero before proceeding, and also ensures the velocity does not exceed the maximum speed. | ||
* func_tank: | * func_tank: | ||
Line 82: | Line 87: | ||
** Calculate the distance from their centre to their bounding box maximum more reliably. | ** Calculate the distance from their centre to their bounding box maximum more reliably. | ||
** NPCs now calculate the standing position in real time, accounting for the direction it's currently facing. | ** NPCs now calculate the standing position in real time, accounting for the direction it's currently facing. | ||
− | * func_train: Fixed moving sound not stopping if the train is halted whilst between path points. | + | * func_tanklaser: Prevent from killing allies of the operator or the operator them self. |
− | * | + | * func_train: |
+ | ** Fixed moving sound not stopping if the train is halted whilst between path points. | ||
+ | ** More useful message when a train has no first position target. | ||
* func_vehicle: Ported native entity from Counter-Strike. (Re-implementation.) | * func_vehicle: Ported native entity from Counter-Strike. (Re-implementation.) | ||
− | * HUD: Added hide flags for crosshair | + | * HUD: Added hide flags for crosshair "HIDEHUD_CROSSHAIR" and ammo "HIDEHUD_AMMO". |
− | ** Network message for hide HUD flags | + | ** Network message for hide HUD flags "HideHUD" now writes a single short instead of a single byte to accommodate for more than 8 flags. |
− | * HUD: Changed hide flags | + | * HUD: Changed hide flags "HIDEHUD_HEALTH" and "HIDEHUD_SUITPOWER" to hide their respective information from the scoreboard. |
* HUD: Text chat messages will no longer be blocked from voice muted players as standard. | * HUD: Text chat messages will no longer be blocked from voice muted players as standard. | ||
− | ** Boolean CVAR | + | ** Boolean CVAR "hud_saytext_block_muted" will let players decide if they want text chat blocked from voice muted players. |
** This setting is turned off by default (0), meaning when players are voice muted their text chat will still be seen. | ** This setting is turned off by default (0), meaning when players are voice muted their text chat will still be seen. | ||
* HUD: Info text tweaks. | * HUD: Info text tweaks. | ||
Line 96: | Line 103: | ||
** Reduce HUD next time to 125ms from 200ms for slightly faster updates in dense battles. | ** Reduce HUD next time to 125ms from 200ms for slightly faster updates in dense battles. | ||
* Improved players maximum speed not always updating: | * Improved players maximum speed not always updating: | ||
− | ** Help ensure player speed is reset according to | + | ** Help ensure player speed is reset according to "sv_maxspeed" when being forcibly respawned by a map. |
− | ** This improves reliably slightly, but only if the new maximum speed is less than | + | ** This improves reliably slightly, but only if the new maximum speed is less than "sv_maxspeed". |
− | ** This should help maps that want to change player maximum speed with the | + | ** This should help maps that want to change player maximum speed with the "sv_maxspeed" map CVAR for specific parts of their map only, though it still requires mappers to trigger their entities in the correct order. |
* Improved string append performance. (Modest performance increase to the node graph generation, noticeable for big maps.) | * Improved string append performance. (Modest performance increase to the node graph generation, noticeable for big maps.) | ||
* Libcurl updated to 8.5.0 with zlib (1.3), asynchronous DNS (c-ares 1.25.0), HTTP/2 (nghttp2 1.58.0), and OpenSSL 3.2.0. | * Libcurl updated to 8.5.0 with zlib (1.3), asynchronous DNS (c-ares 1.25.0), HTTP/2 (nghttp2 1.58.0), and OpenSSL 3.2.0. | ||
− | ** Linux build includes OpenSSL 3.0.5. (No more needing to manually install | + | ** Linux build includes OpenSSL 3.0.5. (No more needing to manually install "libssl1.1".) |
** Windows build still uses SCHANNEL, however Windows Vista and Server 2008 will no longer be supported. | ** Windows build still uses SCHANNEL, however Windows Vista and Server 2008 will no longer be supported. | ||
− | * Linux: Build architecture changed from | + | * Linux: Build architecture changed from "i486" to "pentium4". (This effectively enables SSE and SSE2 extensions sets.) |
− | * Map configuration: Added support for | + | * Map configuration: |
− | * mapinfo command: Corrected CVAR | + | ** Added support for "ammo_9mmAR", "ammo_mp5clip", and "ammo_9mmbox" entities. |
− | * monstermaker/squadmaker: Now stores the monster class name in the | + | ** Allow support for all ammo_* entities. |
+ | * mapinfo command: Corrected CVAR "mp_forcespawn", should be "mp_forcerespawn". | ||
+ | * monstermaker/squadmaker: | ||
+ | ** Fixed NPCs becoming stuck when spawning inside each other. | ||
+ | ** Now stores the monster class name in the "noise" entity variable. (Allows scripts to know what entity they are spawning.) | ||
* Node graph brush entity blocking a link handling: Do not allow monsters to go through doors that are locked by a master or do not fulfil its inventory requirements. | * Node graph brush entity blocking a link handling: Do not allow monsters to go through doors that are locked by a master or do not fulfil its inventory requirements. | ||
* Optimized collision tests for objects intersecting players. | * Optimized collision tests for objects intersecting players. | ||
* Particles: Check for empty string when running a muzzle flash particle. (Fixes a Linux specific crash.) | * Particles: Check for empty string when running a muzzle flash particle. (Fixes a Linux specific crash.) | ||
* Physics entities: Do not apply fall initialisation when the move type is none. | * Physics entities: Do not apply fall initialisation when the move type is none. | ||
− | * Player: Corrected LAN mode check to match how the engine does it. | + | * Player: |
− | * | + | ** Corrected LAN mode check to match how the engine does it. |
− | * Player entity: Added virtual read-only keys | + | ** Fixed player blood colour, class name, gravity, long jump, and team being reset unintentionally. |
− | * Player entity: Two players (or more) can be marked as non-colliding by setting key | + | ** Fixed player effects not being persisted when revived. (E.g. from an item providing effects you are allowed to hold on death.) |
+ | ** Local player will no longer be rendered if in first person mode unless looking through another entity. | ||
+ | * Player entity: Added virtual read-only keys "adminlevel", "authid", and "xtralevel" of which can be read by "trigger_condition". | ||
+ | * Player entity: Two players (or more) can be marked as non-colliding by setting key "iuser4" to an integer higher than zero: | ||
** This must be applied to both players. (If one player does not have it they will collide.) | ** This must be applied to both players. (If one player does not have it they will collide.) | ||
− | ** Maps can set this by adjusting key | + | ** Maps can set this by adjusting key "iuser4" on the player. (E.g. via a "trigger_changevalue".) |
− | ** Scripts can set this via the | + | ** Scripts can set this via the "entvars" structure. (E.g. `pPlayer.pev.iuser4`.) |
** Known issue: There will be a tiny bump between the two players for one frame when they begin to enter each other's space, then proceed to not collide. | ** Known issue: There will be a tiny bump between the two players for one frame when they begin to enter each other's space, then proceed to not collide. | ||
** Known issue: If you are crouched while non-colliding you can't stand up until you both leave each other's space. | ** Known issue: If you are crouched while non-colliding you can't stand up until you both leave each other's space. | ||
* Player movement: | * Player movement: | ||
− | ** Reference | + | ** Reference "clientmaxspeed" instead of "maxspeed" when clamping movement speed for air, ladder, walk, and water. (This allows a positive speed multiplier effect such as from "item_inventory" to work without needing to increase "sv_maxspeed" and apply a bunch of tricks to lower everyone else's maximum speed.) |
** When exiting water at a vertical edge, increase jump velocity from 225 to 240. (Fix for being unable to climb vertically out of water on legacy maps, such as the shark tank on Incoming.) | ** When exiting water at a vertical edge, increase jump velocity from 225 to 240. (Fix for being unable to climb vertically out of water on legacy maps, such as the shark tank on Incoming.) | ||
* Player spawn points: Fixed spawn point targets being unintentionally triggered by cascade when the spawn point itself was being turned on/off. | * Player spawn points: Fixed spawn point targets being unintentionally triggered by cascade when the spawn point itself was being turned on/off. | ||
Line 132: | Line 146: | ||
* Restored bullet hit sound effects. | * Restored bullet hit sound effects. | ||
* Studio model event: Check for empty event options string for client side sound (5004) and custom muzzle sprite (5005 and 5006) before attempting to use it for a sound or particle. | * Studio model event: Check for empty event options string for client side sound (5004) and custom muzzle sprite (5005 and 5006) before attempting to use it for a sound or particle. | ||
− | * squadmaker: Add key | + | * squadmaker: |
− | * | + | ** Add key "new_skin" to set the model's skin number. (-1 to ignore, just like for "new_body".) |
− | * | + | ** Fixed "new_body" not marking its key as handled when processed. |
+ | ** Removed "nonsolid", replaced with "new_solid" to set the solidity of child entities. (Just fixing "notsolid" caused too many conflicts with legacy maps.) | ||
* Third person camera overhauled: | * Third person camera overhauled: | ||
− | ** Holding the ALT key while in third person now provides better and more | + | ** Holding the ALT key while in third person now provides better and more modernised control over the camera. |
*** ALT + mouse move: Rotate the camera. | *** ALT + mouse move: Rotate the camera. | ||
*** ALT + mouse scroll: Zoom in/out. | *** ALT + mouse scroll: Zoom in/out. | ||
*** ALT + E: Save camera angles, with a confirmation sound and console message. (Not saving any new camera angles will transition the third person camera back to your last saved settings.) | *** ALT + E: Save camera angles, with a confirmation sound and console message. (Not saving any new camera angles will transition the third person camera back to your last saved settings.) | ||
− | *** New CVAR | + | *** New CVAR "cam_reset_time" to reset the camera after rotating. (Default: 2 seconds) |
− | *** New CVAR | + | *** New CVAR "cam_max_dist" sets how far the camera can zoom out. (Default: 512 units) |
** Collision detection and smoothness are greatly improved by using precise point content queries instead of hull traces. | ** Collision detection and smoothness are greatly improved by using precise point content queries instead of hull traces. | ||
** Seamless transitions between first and third person now occur when space is limited. (E.g. crawling in a vent.) | ** Seamless transitions between first and third person now occur when space is limited. (E.g. crawling in a vent.) | ||
** Third person view with weapon zoom automatically switches to first person. | ** Third person view with weapon zoom automatically switches to first person. | ||
− | ** Camera rotation is locked to +/- 60 degrees when using cam_followaim aka | + | ** Camera rotation is locked to +/- 60 degrees when using "cam_followaim" aka "Look at Crosshairs". |
− | * trigger_change_class: Add support for | + | * trigger_change_class: Add support for "!activator" and "!caller". ''(Thanks Outerbeast.)'' |
− | * trigger_changelevel: Float-safe clamp when reading | + | * trigger_changelevel: Float-safe clamp when reading "percent_of_players" key. |
* trigger_changemodel: Fixed not applying the desired skin. ''(Thanks Outerbeast.)'' | * trigger_changemodel: Fixed not applying the desired skin. ''(Thanks Outerbeast.)'' | ||
* trigger_changetarget: Fixed only applying to one entity instead of all entities with the matching target name. ''(Thanks Outerbeast.)'' | * trigger_changetarget: Fixed only applying to one entity instead of all entities with the matching target name. ''(Thanks Outerbeast.)'' | ||
Line 154: | Line 169: | ||
* trigger_push: | * trigger_push: | ||
** Fixed velocity check for negative directions when force push mode is on. | ** Fixed velocity check for negative directions when force push mode is on. | ||
− | ** Fixes for when the | + | ** Fixes for when the "push once" spawn flag is set: |
*** The workaround for upward lifting things on the ground will now also apply. | *** The workaround for upward lifting things on the ground will now also apply. | ||
*** Support for both of the force push modes. (Even if the velocity is still only transferred once.) | *** Support for both of the force push modes. (Even if the velocity is still only transferred once.) | ||
** If a pushable has more intricate collision (when solid type set to SOLID_BSP), ensure that they aren't skipped if their move type is MOVETYPE_PUSHSTEP (e.g. a pushable object). This does not affect older levels, only levels moving forward that have pushables with their solid type set to SOLID_BSP instead of SOLID_BBOX. | ** If a pushable has more intricate collision (when solid type set to SOLID_BSP), ensure that they aren't skipped if their move type is MOVETYPE_PUSHSTEP (e.g. a pushable object). This does not affect older levels, only levels moving forward that have pushables with their solid type set to SOLID_BSP instead of SOLID_BBOX. | ||
− | ** Implement inventory rules. Implemented in inverse, so matching the rules will PREVENT being pushed. (Behaves the same as | + | ** Implement inventory rules. Implemented in inverse, so matching the rules will PREVENT being pushed. (Behaves the same as "trigger_hurt", whereby matching the rules blocks damage.) |
** Improved efficiency of force push mode by using dot product to check if minimum velocity is already achieved before amending velocity. | ** Improved efficiency of force push mode by using dot product to check if minimum velocity is already achieved before amending velocity. | ||
− | ** New push mode | + | ** New push mode "pushmode" choice property to accommodate a new exact velocity of pushing. |
*** Regular (0): The standard. Can be resisted by the pushed thing trying to move or interfering physics. | *** Regular (0): The standard. Can be resisted by the pushed thing trying to move or interfering physics. | ||
− | *** Forced with minimum velocity (1): What we called | + | *** Forced with minimum velocity (1): What we called "force push" (flag). The pushed thing can move faster than specified, but not slower. (Accepts some gravity/friction interference.) |
*** Forced with exact velocity (2): New mode. The pushed thing can only move at exactly the velocity specified, no faster or slower. (Defies gravity/friction entirely.) | *** Forced with exact velocity (2): New mode. The pushed thing can only move at exactly the velocity specified, no faster or slower. (Defies gravity/friction entirely.) | ||
− | *** (The | + | *** (The "force push" flag is deprecated in favour of the choice property, though the flag will still work in existing maps unchanged.) |
* Updated SDL to 2.30.1 (5th March 2024) from 2.0.0 (13th August 2013): | * Updated SDL to 2.30.1 (5th March 2024) from 2.0.0 (13th August 2013): | ||
− | ** Fixes various issues with mouse input on Linux systems. (Such as mouse scroll acting as | + | ** Fixes various issues with mouse input on Linux systems. (Such as mouse scroll acting as "mouse4" and "mouse5".) |
− | * VGUI: Inventory screen buttons no longer have a gap before their text. (This particularly fixes the close [X] button at the top right appearing empty on lower resolutions.) | + | * VGUI: |
− | * | + | ** Inventory screen buttons no longer have a gap before their text. (This particularly fixes the close [X] button at the top right appearing empty on lower resolutions.) |
− | * VGUI command button: Added property | + | ** Tinted green team's colour towards cyan a bit so that it's less similar to yellow. |
+ | * VGUI command button: Added property "no empty bound key gap" to disable the 5 spaces being prepended to buttons that don't have a key bound to their action, but don't want a gap. (This allows buttons to have centred text without there being obscure left padding offsetting the text on the left side.) | ||
* Voting tweaks/fixes: | * Voting tweaks/fixes: | ||
** Do not allow kill votes towards observers or dead players. | ** Do not allow kill votes towards observers or dead players. | ||
Line 184: | Line 200: | ||
* Angelscript API updated to version 2.36.1. (See changes here: [https://www.angelcode.com/angelscript/changes.php www.angelcode.com/angelscript/changes.php]) | * Angelscript API updated to version 2.36.1. (See changes here: [https://www.angelcode.com/angelscript/changes.php www.angelcode.com/angelscript/changes.php]) | ||
* Added colour definitions for a wider range of colour palettes: X11/web standard, Windows 20, and Sven Co-op brand. | * Added colour definitions for a wider range of colour palettes: X11/web standard, Windows 20, and Sven Co-op brand. | ||
− | * Added CVAR | + | * Added CVAR "angelscript_compiler_treat_warnings_as_errors" for configurable compiler warning behaviour: |
** 0: Warnings are printed to console. (New default.) | ** 0: Warnings are printed to console. (New default.) | ||
** 1: Warnings will be treated as errors, printed to console, and halt script compilation. (Recommended for production releases.) | ** 1: Warnings will be treated as errors, printed to console, and halt script compilation. (Recommended for production releases.) | ||
− | * Added hook | + | * Added hook "PlayerRevived", fired when a player is resurrected by another player or NPC. |
* ASPlayerEntity: Corrected signature of function `RemoveAllItems()`. The two bool parameters are implicitly false if unspecified. | * ASPlayerEntity: Corrected signature of function `RemoveAllItems()`. The two bool parameters are implicitly false if unspecified. | ||
* CASPlayerFuncs: Abort `ClientPrint()` if `pPlayer` is null. | * CASPlayerFuncs: Abort `ClientPrint()` if `pPlayer` is null. | ||
* Corrected documentation for `BestVisibleEnemy()`. | * Corrected documentation for `BestVisibleEnemy()`. | ||
* Corrected documentation for `CSprite::Frames()`: Returns an `int`, not a `float`. | * Corrected documentation for `CSprite::Frames()`: Returns an `int`, not a `float`. | ||
+ | * Corrected exposed type of `CItemInventory::m_szDisplayName` to match the actual class member type. (string_t) | ||
* DateTime objects: | * DateTime objects: | ||
** Added support for leap second. (Max value is 60 instead of 59.) | ** Added support for leap second. (Max value is 60 instead of 59.) | ||
Line 199: | Line 216: | ||
** Corrected documentation for some of these set/get functions, particularly expected value ranges, and alignment with the AngelScript base. | ** Corrected documentation for some of these set/get functions, particularly expected value ranges, and alignment with the AngelScript base. | ||
* Expose `CBaseWeapon::Reload()`. Only called when `Reload()` is called. | * Expose `CBaseWeapon::Reload()`. Only called when `Reload()` is called. | ||
− | * Expose `CBaseEntity::OnSetOriginByMap()`. This allows you to reset the default position of say a door or | + | * Expose `CBaseEntity::OnSetOriginByMap()`. This allows you to reset the default position of say a door or "item_inventory" after moving it with your script. |
− | * Expose `CItemInventory::TryCollect()`. This is the ideal way to make a potential item holder pick up an | + | * Expose `CItemInventory::TryCollect()`. This is the ideal way to make a potential item holder pick up an "item_inventory" remotely. |
* Expose `COLLECT_TYPE` enumerator. | * Expose `COLLECT_TYPE` enumerator. | ||
* Expose `DROP_TYPE` enumerator. | * Expose `DROP_TYPE` enumerator. | ||
− | * Expose `EFLAG` enumerator and helper functions that can be used by entities to not collide with friendly or to ignore | + | * Expose `EFLAG` enumerator and helper functions that can be used by entities to not collide with friendly or to ignore "trigger_gravity". |
* Expose `HIDEHUD` enumerator. | * Expose `HIDEHUD` enumerator. | ||
* Expose `m_dropType` so DROP_TYPE enum has something to be used with. | * Expose `m_dropType` so DROP_TYPE enum has something to be used with. | ||
Line 209: | Line 226: | ||
* Expose `MonsterKilled()` and `MonsterTakeDamage()` hooks. (These are equivalent as the player hook counterparts.) | * Expose `MonsterKilled()` and `MonsterTakeDamage()` hooks. (These are equivalent as the player hook counterparts.) | ||
* Expose the map the server is changing to in `OnMapEnd()`. | * Expose the map the server is changing to in `OnMapEnd()`. | ||
− | ** Hook | + | ** Hook "MapChange" now receives a string to reveal which map the server is about to change to, or empty if the server is shutting down. |
− | ** '''ALL scripts listening for this | + | ** '''ALL scripts listening for this "MapChange" event will need an update.''' Just add a parameter for a string to receive the new map. |
* Expose `VP_TYPE` enumerator, with its map counterpart `MAP_VP_TYPE`. | * Expose `VP_TYPE` enumerator, with its map counterpart `MAP_VP_TYPE`. | ||
− | * Fixed a crash when attempting to remove an | + | * Fixed a crash when attempting to remove an "item_inventory" from a holder, either via `Drop()`, `Return()` or `Destroy()` functions on the item entity. |
* Fixed a crash with Item Mapping arrays if there's a trailing comma at end of the list. | * Fixed a crash with Item Mapping arrays if there's a trailing comma at end of the list. | ||
− | * Fixed a lot of missing variables from the | + | * Fixed a lot of missing variables from the "item_inventory" documentation. (Mostly for self-activation enabled items.) |
* Fixed a potential crash whereby a script removes a scheduled function from the scheduler but then erases the variable it was stored in (by `= null`) before the next frame. | * Fixed a potential crash whereby a script removes a scheduled function from the scheduler but then erases the variable it was stored in (by `= null`) before the next frame. | ||
* Fixed model interpolation logic (physics issues): | * Fixed model interpolation logic (physics issues): | ||
Line 221: | Line 238: | ||
* Function `CBasePlayer::RemoveAllItems()` now takes a second boolean to remove long jump. | * Function `CBasePlayer::RemoveAllItems()` now takes a second boolean to remove long jump. | ||
** '''ALL scripts calling `CBasePlayer::RemoveAllItems()` will need an update.''' Just add a boolean `true` to remove long jump or `false` to let the player keep it. | ** '''ALL scripts calling `CBasePlayer::RemoveAllItems()` will need an update.''' Just add a boolean `true` to remove long jump or `false` to let the player keep it. | ||
+ | * Player functions: The HUD text parameters channel now matches the behaviour of "game_text" whereby map scripts will be remapped from 1-4 to 5-8 implicitly, so that server plug-ins can remain using channels 1-4 relatively conflict free of map produced messages. (All scripts should continue to use text channels 1-4 as they already do.) | ||
* Re-think of how server plug-ins are included/excluded on a per-map basis to correct a few quirks across map changes. | * Re-think of how server plug-ins are included/excluded on a per-map basis to correct a few quirks across map changes. | ||
− | ** CVAR | + | ** CVAR "plugin_list_file_persistent" is no longer required and has been removed. |
* RGBA structure: | * RGBA structure: | ||
** Added constructors to take in a vector with optional alpha channel. (255/opaque assumed if unspecified.) | ** Added constructors to take in a vector with optional alpha channel. (255/opaque assumed if unspecified.) | ||
** Added function `opEquals()`: For comparing two RGBA instances. | ** Added function `opEquals()`: For comparing two RGBA instances. | ||
− | ** Added function `ToString()`: To output an RGBA object as | + | ** Added function `ToString()`: To output an RGBA object as "r g b" string, or with optional alpha channel to output "r g b a" string. |
− | ** Added utility function `StringToRGBA()`: Converts a string to an RGBA structure. String must be formatted in RGB as | + | ** Added utility function `StringToRGBA()`: Converts a string to an RGBA structure. String must be formatted in RGB as "%d %d %d" or "%f %f %f", or in RGBA as "%d %d %d %d" or "%f %f %f %f". (If RGB is provided the alpha channel will be assumed as 255.0f/opaque.) |
− | * Server plug-ins: Implemented | + | * Scheduler: Fixed incorrect assertion fail when an infinitely repeating schedule is used. |
− | * Server plug-ins not loaded due to | + | * Server plug-ins: Implemented "maps_excluded" properly to work across map changes. |
+ | * Server plug-ins not loaded due to "maps_included" or "maps_excluded" rules will now print a regular message instead of an error in the console. | ||
* trigger_relay: | * trigger_relay: | ||
** Added support for SET and KILL use types. | ** Added support for SET and KILL use types. | ||
− | ** Added | + | ** Added "triggervalue" key for a numeric value to relay, usually for the SET use type. |
* trigger_script: Added flexibility on what is exposed as the activator to the script: | * trigger_script: Added flexibility on what is exposed as the activator to the script: | ||
− | ** In trigger mode new spawn flags 2 and 4 allow passing the entity itself as activator and/or caller instead of the original activator/caller. (Opposite to the | + | ** In trigger mode new spawn flags 2 and 4 allow passing the entity itself as activator and/or caller instead of the original activator/caller. (Opposite to the "Keep activator" spawn flag in other entities like "trigger_relay".) |
** In think mode new spawn flag 64 will remember the original activator as `EHANDLE m_hActivator` so that `!activator` can be kept. The script entity itself is still passed as an argument to the script function, but the script can read the entity's `m_hActivator` to obtain the original activator. (If the flag is off the script entity will be the activator.) | ** In think mode new spawn flag 64 will remember the original activator as `EHANDLE m_hActivator` so that `!activator` can be kept. The script entity itself is still passed as an argument to the script function, but the script can read the entity's `m_hActivator` to obtain the original activator. (If the flag is off the script entity will be the activator.) | ||
− | ** Entity class | + | ** Entity class "trigger_script" is now exposed to scripts so that it can be cast from `CBaseEntity@` into `CTriggerScript@`, which is necessary to read the `EHANDLE m_hActivator` in looped think mode. |
* When a plug-in is not compiled because it already exists in the list (e.g. after a map change) simply skip it, don't report it as a failed compile. | * When a plug-in is not compiled because it already exists in the list (e.g. after a map change) simply skip it, don't report it as a failed compile. | ||
Line 242: | Line 261: | ||
* Added auditing to player spray uploads: | * Added auditing to player spray uploads: | ||
− | ** Write a server log entry when a file uploaded is accepted from a player, including the MD5 checksum, which can be matched via command | + | ** Write a server log entry when a file uploaded is accepted from a player, including the MD5 checksum, which can be matched via command "hpklist". |
− | ** Write a custom HPK log | + | ** Write a custom HPK log "custom.hpk.log" line with a consistent list of MD5 checksums uploaded along with a date/time, user ID, Steam ID, and player name. |
− | ** (Use the | + | ** (Use the "hpklist" and "hpkextract" commands to export the uploaded spray in WAD format.) |
− | * Added conditional smoothing for light styles: Activates when the last character in the light entity's | + | * Added conditional smoothing for light styles: Activates when the last character in the light entity's "Custom Appearance" pattern is "~". |
− | * Added CVAR | + | * Added CVAR "viewmodel_fov" to independently adjust the field of view for a player's weapon viewport model. |
* Added debug feature to draw bounding boxes around local physics entities in the player movement simulation when `r_drawentities` is set to 7. | * Added debug feature to draw bounding boxes around local physics entities in the player movement simulation when `r_drawentities` is set to 7. | ||
* Block Powershell scripts from being downloaded in game. (.ps1) | * Block Powershell scripts from being downloaded in game. (.ps1) | ||
Line 252: | Line 271: | ||
** Only calculate parameter and value lengths once. | ** Only calculate parameter and value lengths once. | ||
** Fixed [https://nvd.nist.gov/vuln/detail/CVE-2023-30382 CVE-2023-30382]. (Limits command line parameters to their intended maximum buffer size of 4096.) | ** Fixed [https://nvd.nist.gov/vuln/detail/CVE-2023-30382 CVE-2023-30382]. (Limits command line parameters to their intended maximum buffer size of 4096.) | ||
− | ** If a value is non-empty and begins a hyphen '-' wrap the value in | + | ** If a value is non-empty and begins a hyphen '-' wrap the value in "quotes", and allocate 2 extra to the length of the new command line string. |
* Dedicated server launcher: | * Dedicated server launcher: | ||
− | ** Always include | + | ** Always include "log on" to the primary in-server command list. |
− | ** Always wrap the chosen map in | + | ** Always wrap the chosen map in "quotes". |
** Fixed a few unsafe string copy operations. | ** Fixed a few unsafe string copy operations. | ||
* Enhanced entity collision for possible hulls inside walls or objects: | * Enhanced entity collision for possible hulls inside walls or objects: | ||
** The hull is now always centred on the entity's origin for the X and Y axis. | ** The hull is now always centred on the entity's origin for the X and Y axis. | ||
** Avoids entities erroneously disappearing into a wall or falling through the floor even when there was plenty of room. | ** Avoids entities erroneously disappearing into a wall or falling through the floor even when there was plenty of room. | ||
− | ** Attempt an 4 unit nudge in all directions for the X and Y axis if the initial trace was found to be all solid. (This allows entities some margin of error before being declared | + | ** Attempt an 4 unit nudge in all directions for the X and Y axis if the initial trace was found to be all solid. (This allows entities some margin of error before being declared "stuck in the world" and falling out of the map.) |
* Engine new DLL functions version 2: | * Engine new DLL functions version 2: | ||
** Added `pfnChangingLevel( const char *level )` to inform the game DLL when the engine is about to change level, and more importantly, to WHICH level. | ** Added `pfnChangingLevel( const char *level )` to inform the game DLL when the engine is about to change level, and more importantly, to WHICH level. | ||
** This will allow the game DLL to react/prepare for the next level about to start. (`level` will point to null if no next level is due, e.g. when the server is closing down.) | ** This will allow the game DLL to react/prepare for the next level about to start. (`level` will point to null if no next level is due, e.g. when the server is closing down.) | ||
** Implementation for `pfnChangingLevel()` when the server thread shuts down: | ** Implementation for `pfnChangingLevel()` when the server thread shuts down: | ||
− | *** Commands | + | *** Commands "reload" and "restart" will pass through the current level name. |
− | *** Commands | + | *** Commands "changelevel" and "changelevel2" will pass through the new level name if it's valid. |
− | * Ensure gravity is always applied in the physics simulation for | + | * Ensure gravity is always applied in the physics simulation for "MOVETYPE_PUSHSTEP" and "MOVETYPE_STEP" entities to prevent them from flying off into space. (Gravity is now always applied, regardless of whether the entity was believed to be on the ground in the previous frame.) |
* Fixed a batch of potential buffer overflows discovered when fixing CVE-2023-30382. | * Fixed a batch of potential buffer overflows discovered when fixing CVE-2023-30382. | ||
− | * Fixed a null pointer dereference in `NET_GraphValue()` when the client DLL doesn't make a declaration for keyboard command | + | * Fixed a null pointer dereference in `NET_GraphValue()` when the client DLL doesn't make a declaration for keyboard command "in_graph" and "+graph" is activated whilst "net_graph" is active. |
* Fixed a null pointer exception if `PvAllocEntPrivateData()` or `FreeEntPrivateData()` is given a null edict. | * Fixed a null pointer exception if `PvAllocEntPrivateData()` or `FreeEntPrivateData()` is given a null edict. | ||
* Fixed a pointless constant recalculation of a model's scale when it never changes. | * Fixed a pointless constant recalculation of a model's scale when it never changes. | ||
Line 275: | Line 294: | ||
** A P2P socket will now only be opened when a player is running a listen server or connects to a P2P game address. | ** A P2P socket will now only be opened when a player is running a listen server or connects to a P2P game address. | ||
** All existing sockets (IP and P2P) will now be explicitly closed when disconnecting from any game server, so that any UDP listening socket you had open whilst you were in a P2P game will not still be open if you move to a non-P2P game. | ** All existing sockets (IP and P2P) will now be explicitly closed when disconnecting from any game server, so that any UDP listening socket you had open whilst you were in a P2P game will not still be open if you move to a non-P2P game. | ||
− | ** Added console messages | + | ** Added console messages "Closed IP networking." and "Closed Steam P2P networking." so players can see some assurance of when these happen. |
* Fixed an exploit with client resource uploading. | * Fixed an exploit with client resource uploading. | ||
* Fixed an exploit with resource consistency checking. | * Fixed an exploit with resource consistency checking. | ||
+ | * Fixed an issue with pushables falling through the floor due to having a larger bounding box than world hull size. | ||
+ | * Fixed an issue with remapped skins not supporting "STUDIO_NF_MASKED". (Texture flag is now checked when the texture is re-uploaded to GL.) | ||
+ | * Fixed scrolling/conveyor texture speed to account for texture scale. (Ensures objects on a conveyor belt move at the same speed as the texture's scroll rate.) | ||
* Fixed empty pre-cached files in the server preventing players from joining. | * Fixed empty pre-cached files in the server preventing players from joining. | ||
− | * Fixed file system API being unable to find a file if path contains a non-existent directory followed by | + | * Fixed file system API being unable to find a file if path contains a non-existent directory followed by "/../" on Linux systems. (Also fixes issue with AngelScript failing to include files containing dot-dot-slash in file path.) |
* Fixed glitchy visual popping for NPCs that walk or run while being moved. (E.g. by falling or being pushed by something.) | * Fixed glitchy visual popping for NPCs that walk or run while being moved. (E.g. by falling or being pushed by something.) | ||
* Fixed hull size selection regression that caused some BSP models to get stuck inside walls or other objects. | * Fixed hull size selection regression that caused some BSP models to get stuck inside walls or other objects. | ||
− | * Fixed IP socket being wrongly created when | + | * Fixed IP socket being wrongly created when "-noip" launch parameter is specified when joining a 2nd+ game. |
* Fixed listen server not being gracefully shut down prior to the engine being restarted. (Such as when changing screen resolution.) | * Fixed listen server not being gracefully shut down prior to the engine being restarted. (Such as when changing screen resolution.) | ||
* Fixed player weapon view port model clipping back into their own vision/camera. | * Fixed player weapon view port model clipping back into their own vision/camera. | ||
* HPAK commands: | * HPAK commands: | ||
− | ** When showing the contents of a HPAK use the real index of each item rather than a number starting from zero. (The real index is what you pass to | + | ** When showing the contents of a HPAK use the real index of each item rather than a number starting from zero. (The real index is what you pass to "hpkextract" and "hpkremove", rather than being 1 out.) |
** hpkextract: WAD file names written changed from 4-zero to 5-zero, as the limit for a HPK is 32768 entries. | ** hpkextract: WAD file names written changed from 4-zero to 5-zero, as the limit for a HPK is 32768 entries. | ||
− | ** hpkextract: Show the MD5 checksum of the lump being exported so you can see it matches what you saw in | + | ** hpkextract: Show the MD5 checksum of the lump being exported so you can see it matches what you saw in "hpklist" and the recently added upload audit. |
* HTTP content downloader: Audit the HTTP response status code. (Include in console error message.) | * HTTP content downloader: Audit the HTTP response status code. (Include in console error message.) | ||
* Implemented point hull and left-aligned hull collision options via new spawn flags: | * Implemented point hull and left-aligned hull collision options via new spawn flags: | ||
** SF_FORCE_POINT_HULL_FOR_BRUSH_MODEL_COLLISIONS (16,777,216): Force the engine to use the point hull when performing collision tests against brush models. | ** SF_FORCE_POINT_HULL_FOR_BRUSH_MODEL_COLLISIONS (16,777,216): Force the engine to use the point hull when performing collision tests against brush models. | ||
** SF_FORCE_LEFT_ALIGNED_HULL_FOR_BRUSH_MODEL_COLLISIONS (33,554,432): Use the original left-aligned hull alignment algorithm for collision tests against brush models. | ** SF_FORCE_LEFT_ALIGNED_HULL_FOR_BRUSH_MODEL_COLLISIONS (33,554,432): Use the original left-aligned hull alignment algorithm for collision tests against brush models. | ||
− | * Increased length limit of | + | * Increased length limit of "sv_downloadurl" to 1,740 from 127. (Matches 2000 as per RFC 9110, the maximum path length of 260 expected to be appended to this base URL.) |
* Increased MAX_PACKET_ENTITIES to 1024 from 512. | * Increased MAX_PACKET_ENTITIES to 1024 from 512. | ||
* Increased MAX_PHYSENTS to 1024 from 600. | * Increased MAX_PHYSENTS to 1024 from 600. | ||
* Increased MAX_VISEDICTS to 1024 from 512. | * Increased MAX_VISEDICTS to 1024 from 512. | ||
− | * Light maps will be rebuild when | + | * Light maps will be rebuild when "gl_overbright" is changed at runtime. |
* Linux dedicated server binaries for AMD x86-32 will no longer be provided. (They were buggy, and frankly unnecessary. Use the i686 binaries instead.) | * Linux dedicated server binaries for AMD x86-32 will no longer be provided. (They were buggy, and frankly unnecessary. Use the i686 binaries instead.) | ||
* Server: Resources will be checked if they're too big to be transferred without opening a handle to them. | * Server: Resources will be checked if they're too big to be transferred without opening a handle to them. | ||
− | ** This should improve an issue whereby a server will hang/stall momentarily when a download request from a client is refused due to being too large as per | + | ** This should improve an issue whereby a server will hang/stall momentarily when a download request from a client is refused due to being too large as per "sv_filetransfermaxsize".) |
** This will depend on which file system module is being used by the server (internal/stdio or Steam), as we can only improve this for the internal/stdio file system. | ** This will depend on which file system module is being used by the server (internal/stdio or Steam), as we can only improve this for the internal/stdio file system. | ||
− | * Server: When no IP address is explicitly specified (with | + | * Server: When no IP address is explicitly specified (with "+ip") on a system with multiple network interfaces, and the game is multi-player ("maxplayers" >= 2), bind to "0.0.0.0" (all network interfaces) instead of "localhost". |
* Svengine server interface version 2: Added function `GetPlayerAddr()` to retrieve a player's IP address (and optionally port number) after the player has completed their initial connection. | * Svengine server interface version 2: Added function `GetPlayerAddr()` to retrieve a player's IP address (and optionally port number) after the player has completed their initial connection. | ||
* Updated how the server checks for client IP address restrictions in LAN games: | * Updated how the server checks for client IP address restrictions in LAN games: | ||
− | ** Accept the default IPv4 network (0.0.0.0/8) and default IPv6 address ( | + | ** Accept the default IPv4 network (0.0.0.0/8) and default IPv6 address ("::" or "0000:0000:0000:0000:0000:0000:0000:0000") as a reserved address. |
** Check that both server and client are reserved addresses, not just the client. | ** Check that both server and client are reserved addresses, not just the client. | ||
− | ** If either the server or client addresses aren't reserved attempt a prefix match instead. (Currently only Windows servers will do this.) This adds support for LAN games to happen outside of reserved addresses from RFCs 5735 and 5156. (E.g. a player with an IP address within | + | ** If either the server or client addresses aren't reserved attempt a prefix match instead. (Currently only Windows servers will do this.) This adds support for LAN games to happen outside of reserved addresses from RFCs 5735 and 5156. (E.g. a player with an IP address within "200.50.10.0/24" can join a server also in this same local subnet.) |
− | ** More useful disconnect message when these checks fail: Reference RFCs 5735 and 5156 instead of the out of date | + | ** More useful disconnect message when these checks fail: Reference RFCs 5735 and 5156 instead of the out of date "Class C". |
* Updated SDL to 2.30.1 (5th March 2024) from 2.0.0 (13th August 2013): | * Updated SDL to 2.30.1 (5th March 2024) from 2.0.0 (13th August 2013): | ||
− | ** Fixes various issues with mouse input on Linux systems. (Such as mouse scroll acting as | + | ** Fixes various issues with mouse input on Linux systems. (Such as mouse scroll acting as "mouse4" and "mouse5".) |
=== Sound === | === Sound === | ||
Line 323: | Line 345: | ||
** Remove the entity if an invalid sequence is specified. (E.g. pose sequence name not found in a custom model.) | ** Remove the entity if an invalid sequence is specified. (E.g. pose sequence name not found in a custom model.) | ||
* Female assassin: | * Female assassin: | ||
− | ** Corrected incorrect evaluation of skill setting | + | ** Corrected incorrect evaluation of skill setting "sk_hassassin_enable_cloaking", which considered anything less OR EQUAL to 1.0 to be disabled. (This should have just been anything less than 1.0. Equal to 1.0 is meant to mean on/yes to cloaking.) |
** Fixed dropping multiple handguns when dying when classic mode is enabled. | ** Fixed dropping multiple handguns when dying when classic mode is enabled. | ||
+ | * Fixed "MonsterKilled" hook being triggered multiple times or when gibing a corpse. | ||
* HWGrunt: (Major overhaul) | * HWGrunt: (Major overhaul) | ||
− | ** Don't drop minigun when taking 50+ blast damage if the NPC's | + | ** Don't drop minigun when taking 50+ blast damage if the NPC's "disable drop minigun" option is active. |
** The enemy selection logic has been improved, along with the handling and operation of the minigun firing tasks. | ** The enemy selection logic has been improved, along with the handling and operation of the minigun firing tasks. | ||
** If a friendly entity is blocking the HWGrunt's line of fire, the HWGrunt will now vocalize a sentence. | ** If a friendly entity is blocking the HWGrunt's line of fire, the HWGrunt will now vocalize a sentence. | ||
Line 333: | Line 356: | ||
*** If the damage exceeds 50, there's a 90% chance that the minigun will be dropped, triggering a 3-second stun time during which the HWGrunt cannot fire its pistol and will retreat. | *** If the damage exceeds 50, there's a 90% chance that the minigun will be dropped, triggering a 3-second stun time during which the HWGrunt cannot fire its pistol and will retreat. | ||
** After defeating an enemy the HWGrunt now performs a victory dance, which involves walking over to inspect the defeated enemy. Afterwards, the HWGrunt will run back to its original location. | ** After defeating an enemy the HWGrunt now performs a victory dance, which involves walking over to inspect the defeated enemy. Afterwards, the HWGrunt will run back to its original location. | ||
− | ** A bug has been fixed where the HWGrunt would not dismount from a rope at the appropriate time when spawned as | + | ** A bug has been fixed where the HWGrunt would not dismount from a rope at the appropriate time when spawned as "monster_hwgrunt_repel". The "ACT_GLIDE" animation ("repel_repel") had an excessive number of frames. The HWGrunt now checks more frequently to decide when to dismount. |
** A new ammo pack hit group has been added located on the HWGrunt's back, which acts as armor against incoming attacks. | ** A new ammo pack hit group has been added located on the HWGrunt's back, which acts as armor against incoming attacks. | ||
** Attacks to specific hit groups, such as the stomach or chest, now behave similarly to other Human Grunts. | ** Attacks to specific hit groups, such as the stomach or chest, now behave similarly to other Human Grunts. | ||
Line 341: | Line 364: | ||
** Minigun firing position has been adjusted. | ** Minigun firing position has been adjusted. | ||
** Now aims up and down more consistently when firing or spinning up the minigun. | ** Now aims up and down more consistently when firing or spinning up the minigun. | ||
− | * Kingpin: Attempt to avoid teleporting into an active monster clip brush (including | + | * Kingpin: Attempt to avoid teleporting into an active monster clip brush (including "func_clip") and an active "trigger_hurt" of which will do damage to the kingpin. |
− | * Robot grunt: Fixed shock glow damaging the player that threw a crowbar at it. | + | * Male assassin: Fixed animation when dying in water. |
+ | * Robot grunt: | ||
+ | ** Fixed a crash when taking damage if the inflictor is null and robot is glowing due to being close to destruction. | ||
+ | ** Fixed a freeze with the robot's death animation. | ||
+ | ** Fixed shock glow damaging the player that threw a crowbar at it. | ||
* Scientist (sitting): Fixed display name being empty if a mapper doesn't explicitly set one. | * Scientist (sitting): Fixed display name being empty if a mapper doesn't explicitly set one. | ||
* Sentry turret: | * Sentry turret: | ||
Line 351: | Line 378: | ||
* Opposing Force grunts: | * Opposing Force grunts: | ||
** Remove moving and shooting ability. | ** Remove moving and shooting ability. | ||
− | ** Improved M249 full-auto firing support for older models: The | + | ** Improved M249 full-auto firing support for older models: The "saw_standing" animation used by the SAW Grunt is now analysed during spawn to ensure the firing event is at frame 0. If not, the model is deemed incompatible with the full-auto firing mechanic. |
* Osprey: Stop rotor sound when destroyed. | * Osprey: Stop rotor sound when destroyed. | ||
* Xen tree: Do not attack dead or non-solid stuff. | * Xen tree: Do not attack dead or non-solid stuff. | ||
Line 363: | Line 390: | ||
** Fixes an instant reload exploit. | ** Fixes an instant reload exploit. | ||
* Health and HEV wall chargers: | * Health and HEV wall chargers: | ||
− | ** Clarified that custom recharge time | + | ** Clarified that custom recharge time "-1" means instantly recharge, not never recharge. |
− | ** Added custom recharge time | + | ** Added custom recharge time "-2" to mean never recharge once depleted. |
* Improved the mechanics of MADWHACK, to make shotgun and explosive attacks more impactful: | * Improved the mechanics of MADWHACK, to make shotgun and explosive attacks more impactful: | ||
− | ** For lethal | + | ** For lethal "DMG_LAUNCH" attacks on NPCs the force is a minimum of 256. |
− | ** For lethal and non-lethal | + | ** For lethal and non-lethal "DMG_BLAST" attacks on NPCs a minimum force of 256 is now applied and capped to 512. |
− | ** For non-lethal | + | ** For non-lethal "DMG_LAUNCH" attacks on NPCs a maximum force of 256 is now applied. |
** Modified the damage force calculation to cap the maximum force to 512, preventing excessively large forces. | ** Modified the damage force calculation to cap the maximum force to 512, preventing excessively large forces. | ||
** Re-factored damage force function to account for the type of damage. The function now accepts an additional parameter for damage type and applies a different scale factor for blast damage, leading to a more accurate representation of the damage force. | ** Re-factored damage force function to account for the type of damage. The function now accepts an additional parameter for damage type and applies a different scale factor for blast damage, leading to a more accurate representation of the damage force. | ||
* Item entities will automatically change its hull to point size if they appear to be stuck in the solid world. (E.g. in a very cramped space.) | * Item entities will automatically change its hull to point size if they appear to be stuck in the solid world. (E.g. in a very cramped space.) | ||
* item_airtank: | * item_airtank: | ||
− | ** Added key | + | ** Added key "air_time_given" to change the default 12 seconds of air time provided on use. |
− | ** Added key | + | ** Added key "refill_delay" to change the default 30 seconds refill delay. (If this is -1 then the air tank can only be used once, it never refills automatically, and just becomes a sitting explosive or prop.) |
** Added keys for custom sounds: | ** Added keys for custom sounds: | ||
*** sound_on_consume | *** sound_on_consume | ||
Line 384: | Line 411: | ||
*** target_on_refill | *** target_on_refill | ||
*** target_on_destroy | *** target_on_destroy | ||
− | ** Added spawn flag 1: | + | ** Added spawn flag 1: "Do not explode", prevents the air tank taking damage and exploding, if a mapper wanted one static minus the trolling. |
− | ** Added spawn flag 2: | + | ** Added spawn flag 2: "Start empty", spawns the tank with no air in it. (It must be refilled by a trigger.) |
− | ** Default health/strength (20) can now be set with the | + | ** Default health/strength (20) can now be set with the "health" key. |
− | ** Fixed sound | + | ** Fixed sound "doors/aliendoor3.wav" not being pre-cached. |
** Fixed the empty sound playing every frame by keeping track of when the air tank was last touched, with a 3 second cool-down delay between each accepted touch. | ** Fixed the empty sound playing every frame by keeping track of when the air tank was last touched, with a 3 second cool-down delay between each accepted touch. | ||
− | ** Implemented | + | ** Implemented "+use" activation, with spawn flags "TOUCH only", "USE only", and "Can Use w/o LoS" as per other item entities. |
** Implemented explicit trigger USE types: | ** Implemented explicit trigger USE types: | ||
*** OFF will set the air tank to be empty. | *** OFF will set the air tank to be empty. | ||
*** ON will set the air tank to refill in the next frame. | *** ON will set the air tank to refill in the next frame. | ||
− | *** SET is for | + | *** SET is for "+use". |
*** TOGGLE will allow a player to consume the air tank remotely by a trigger. (E.g. via a button elsewhere.) | *** TOGGLE will allow a player to consume the air tank remotely by a trigger. (E.g. via a button elsewhere.) | ||
− | *** KILL will destroy the tank. (Pass in value 1 to explode the tank providing the | + | *** KILL will destroy the tank. (Pass in value 1 to explode the tank providing the "Do not explode" spawn flag is not set.) |
* item_inventory: | * item_inventory: | ||
− | ** Fixed internal | + | ** Fixed delay between self-activations "holder_time_activate_wait" working the wrong way around. |
+ | ** Fixed internal "last activated" time not being reset when the item is dropped or re-materialised. | ||
** Fixed trigger on wear-out firing significantly sooner than expected for self-activated items, often immediately on collection or activation. | ** Fixed trigger on wear-out firing significantly sooner than expected for self-activated items, often immediately on collection or activation. | ||
* item_security: Fixed a race condition whereby the item can be picked up twice by touching it and +use-ing it at the same moment really quickly. | * item_security: Fixed a race condition whereby the item can be picked up twice by touching it and +use-ing it at the same moment really quickly. | ||
* Long jump: | * Long jump: | ||
− | ** Fixed physics flag | + | ** Fixed physics flag "slj" not being reset to 0 when a player spawns. (Kept as is when a player is revived.) |
− | ** Added rudimentary way of optionally turning off your long jump with command | + | ** Added rudimentary way of optionally turning off your long jump with command "togglelongjump". This is designed to be a temporary choice, and will reset to the standard ON whenever you respawn or pick up a long jump module. (Physics flag "nolj".) |
* monster_handgrenade: Fixed being revive-able by a player's medkit. | * monster_handgrenade: Fixed being revive-able by a player's medkit. | ||
* player_weaponstrip: Added ability to strip/ignore specific equipment: | * player_weaponstrip: Added ability to strip/ignore specific equipment: | ||
− | ** Added spawn flag 2 | + | ** Added spawn flag 2 "Also strip long jump" to also the long jump from the player. |
− | ** Added key | + | ** Added key "weapons_list" to accept a list of specific weapons to strip, e.g. "weapon_crowbar;weapon_m16". |
− | ** Added key | + | ** Added key "weapons_list_mode" to choose how the above list works: 0 (inclusive) to only strip those in the list, or 1 (exclusive) to strip all NOT in the list. |
* Satchel charges are now easier to throw towards narrow gaps. (They will no longer float 4 units above the ground, and will use the point hull size.) | * Satchel charges are now easier to throw towards narrow gaps. (They will no longer float 4 units above the ground, and will use the point hull size.) | ||
* Snark deploy sounds now play only for the player that deployed it. | * Snark deploy sounds now play only for the player that deployed it. | ||
Line 436: | Line 464: | ||
* Chapter 1-13: | * Chapter 1-13: | ||
− | ** Converted | + | ** Converted "func_wall" props to "func_detail". |
− | ** Set brush entity prop light flags to | + | ** Set brush entity prop light flags to "opaque" so that they cast shadows. |
** Set translucent glass to use embedded light maps so that they are lit correctly. | ** Set translucent glass to use embedded light maps so that they are lit correctly. | ||
* Chapter 1-3: Fixed all of the mismatched lighting from the original Half-Life maps. | * Chapter 1-3: Fixed all of the mismatched lighting from the original Half-Life maps. | ||
Line 444: | Line 472: | ||
* Chapter 7: Fixed texture axis perpendicular to face error on train tracks. | * Chapter 7: Fixed texture axis perpendicular to face error on train tracks. | ||
* Chapter 7 areas 1-2: Added 75 damage to train elevator to prevent elevator clipping through the train if too many players are blocking it from moving. | * Chapter 7 areas 1-2: Added 75 damage to train elevator to prevent elevator clipping through the train if too many players are blocking it from moving. | ||
− | * Chapter 10: Fixed horrible over-bright sky lighting that did not match the original maps. Sky light now toggles to a | + | * Chapter 10: Fixed horrible over-bright sky lighting that did not match the original maps. Sky light now toggles to a "late day" variant once players turn off the surgical machine to match the original Half-Life lighting in the outdoor area. |
* Chapter 11 area 1: | * Chapter 11 area 1: | ||
− | ** Fixed lights in the tunnel connection to | + | ** Fixed lights in the tunnel connection to "Surface Tension" that were the wrong colour. |
** Fence outside of Questionable Ethics exit is now illusionary so that bullets pass through it. | ** Fence outside of Questionable Ethics exit is now illusionary so that bullets pass through it. | ||
* Chapter 12: Fixed leech getting stuck in the giant cog and preventing players from finishing the map. | * Chapter 12: Fixed leech getting stuck in the giant cog and preventing players from finishing the map. | ||
Line 455: | Line 483: | ||
** Fixed reactor not flooding all the way, preventing players from proceeding to the next map. | ** Fixed reactor not flooding all the way, preventing players from proceeding to the next map. | ||
** Fixed reactor status lights not turning green inside of the reactor core when the pumps are activated. | ** Fixed reactor status lights not turning green inside of the reactor core when the pumps are activated. | ||
− | * Chapter 13 area 2 & 3: Fixed missing texture light | + | * Chapter 13 area 2 & 3: Fixed missing texture light "+0~TNNL_LGT4" which was accidentally not included in the RAD files for previous compiles. This fixes all missing orange lights in reactor core area. |
* Chapter 17: | * Chapter 17: | ||
** Fixed the horrendously bright lighting in Nihilanth's chamber and better matches the original Half-Life lighting. | ** Fixed the horrendously bright lighting in Nihilanth's chamber and better matches the original Half-Life lighting. | ||
Line 491: | Line 519: | ||
* Reduced scale of tile based floors to more closely resemble a realistic size. | * Reduced scale of tile based floors to more closely resemble a realistic size. | ||
* Reduced the audible distance of many ambient sounds to reduce too much cross-room disturbance. | * Reduced the audible distance of many ambient sounds to reduce too much cross-room disturbance. | ||
− | * Removed | + | * Removed "maps/checklist.txt" from the resources file. |
* | * | ||
* Removed a lip at the floor of the secure storage doors, making navigation for the hostages out of their rooms easier. | * Removed a lip at the floor of the secure storage doors, making navigation for the hostages out of their rooms easier. | ||
Line 504: | Line 532: | ||
* Fixed missing model replacement paths for grunts. | * Fixed missing model replacement paths for grunts. | ||
* Lighting tweaks. | * Lighting tweaks. | ||
+ | * Moved the map cross sprites 0.9 units closer to the paper so they don't have a floaty gap. | ||
=== Suspension === | === Suspension === | ||
Line 556: | Line 585: | ||
=== They Hunger: Escape === | === They Hunger: Escape === | ||
− | * Changed script entity name | + | * Changed script entity name "func_vehiclecontrols" to "func_vehiclecontrols_custom" to prevent conflict with game code entity and to fix the tutorial car not being drivable after repairing. |
=== Turret Fortress (original) === | === Turret Fortress (original) === | ||
Line 575: | Line 604: | ||
=== NPCs === | === NPCs === | ||
− | * Floater: Marked idle animation as | + | * Floater: Marked idle animation as "ACT_IDLE" and loop so that it's actually used in-game. |
* HWGrunt: | * HWGrunt: | ||
** Add ammo pack hit-box. | ** Add ammo pack hit-box. | ||
− | ** Add footstep events to | + | ** Add footstep events to "pistol_walk", "creeping_walk", and "run". |
** Adjust dimensions of stomach and chest hit-boxes to more accurately reflect torso polygons. | ** Adjust dimensions of stomach and chest hit-boxes to more accurately reflect torso polygons. | ||
** Assign correct hit-box groups to each body type. | ** Assign correct hit-box groups to each body type. | ||
** Increase head hit-box height to fully contain head polygons. | ** Increase head hit-box height to fully contain head polygons. | ||
− | ** Remove oversized | + | ** Remove oversized "Bip01 L Arm" and "Bip01 R Arm". (Arm1, Arm2, Hand is sufficient.) |
=== Other === | === Other === | ||
Line 596: | Line 625: | ||
=== NPCs === | === NPCs === | ||
− | * Human grunt: Added new human grunt sentence group | + | * Human grunt: Added new human grunt sentence group "HG_FLOF". (Used when a friendly is in the NPC's line of fire. Primarily used by the HWGrunt when obstructed by an ally.) |
== Scripts == | == Scripts == | ||
Line 602: | Line 631: | ||
=== Map entities === | === Map entities === | ||
− | * Added | + | * Added "trigger_observer" script: |
− | ** This registers an entity | + | ** This registers an entity "trigger_observer" to allow a map to start/stop a player's observer mode arbitrarily. |
− | ** Point entity mode can apply to players by their target name, including | + | ** Point entity mode can apply to players by their target name, including "!activator" and "!caller" specials. |
** Point entity mode includes optional memory of the player's position so they can be moved back there when leaving observation. | ** Point entity mode includes optional memory of the player's position so they can be moved back there when leaving observation. | ||
** Pretty much an expanded rip-off of Trempler's script from BM:STS, though this also permits the entity to be point based, and handles use types on/off/toggle accordingly. | ** Pretty much an expanded rip-off of Trempler's script from BM:STS, though this also permits the entity to be point based, and handles use types on/off/toggle accordingly. | ||
Line 610: | Line 639: | ||
** Add `Use()` function so the checkpoint can be triggered remotely without a touch. | ** Add `Use()` function so the checkpoint can be triggered remotely without a touch. | ||
** Added HUD notification when a checkpoint is used, and by whom. | ** Added HUD notification when a checkpoint is used, and by whom. | ||
− | ** Added flag to disable | + | ** Added flag to disable "game_player_equip" entities being triggered when checkpoint is used. |
** Added flag to make a checkpoint start inactive, requiring direct trigger to activate it so it can be used. | ** Added flag to make a checkpoint start inactive, requiring direct trigger to activate it so it can be used. | ||
** Added option to change the music that plays when the checkpoint is used via a key that accepts a custom sound. | ** Added option to change the music that plays when the checkpoint is used via a key that accepts a custom sound. | ||
− | ** Fix | + | ** Fix "game_player_equip" being called with `Touch()`, this should be `Use()`. |
− | ** Modified entity register so | + | ** Modified entity register so "map_script point_checkpoint" can be put into a map configuration, without mapper intervention to register the entity after the fact. (See code in included script file for how this is done.) |
** Prevent players from using the checkpoint if there are no dead players, this is to stop checkpoints being wastefully used when there aren't any dead players to revive. (Touching has no effect while all players are alive.) | ** Prevent players from using the checkpoint if there are no dead players, this is to stop checkpoints being wastefully used when there aren't any dead players to revive. (Touching has no effect while all players are alive.) | ||
− | ** Respawning players will now fire the checkpoint's | + | ** Respawning players will now fire the checkpoint's "target" if specified. |
* Hide & Seek: | * Hide & Seek: | ||
− | ** Added function `ShowGameRules()` to show a brief message about the game rules. (Can be called by the map with a | + | ** Added function `ShowGameRules()` to show a brief message about the game rules. (Can be called by the map with a "trigger_script".) |
** Seeker health at 1000 instead of 999. (That old issue with the client crashing when health/armor exceeds 999 no longer exists.) | ** Seeker health at 1000 instead of 999. (That old issue with the client crashing when health/armor exceeds 999 no longer exists.) | ||
* Teslagun weapon: Switched damage type for the secondary fire from DMG_GIB_CORPSE to DMG_SHOCK and DMG_ENERGYBEAM to prevent NPCs from flying away when hit. | * Teslagun weapon: Switched damage type for the secondary fire from DMG_GIB_CORPSE to DMG_SHOCK and DMG_ENERGYBEAM to prevent NPCs from flying away when hit. | ||
Line 643: | Line 672: | ||
* Fixed point entity origin not honouring the floating precision option when exporting to MAP. (Entity origins will no longer snap to whole numbers when the mapper doesn't want this to happen.) | * Fixed point entity origin not honouring the floating precision option when exporting to MAP. (Entity origins will no longer snap to whole numbers when the mapper doesn't want this to happen.) | ||
* Fixed quite a lot of random crashing and unhandled exceptions. | * Fixed quite a lot of random crashing and unhandled exceptions. | ||
− | * Fixed tabbed settings sometimes getting messed up after being | + | * Fixed tabbed settings sometimes getting messed up after being "used" (e.g. seen in a form) more than once. |
* Permit decal to span up to 64 faces instead of 32. | * Permit decal to span up to 64 faces instead of 32. | ||
* Sprite renderer: | * Sprite renderer: | ||
** Do not attempt to render a null frame. (That would otherwise cause a crash if a mapper accidentally sets a sprite based entity to a model file.) | ** Do not attempt to render a null frame. (That would otherwise cause a crash if a mapper accidentally sets a sprite based entity to a model file.) | ||
** View port type will now be used, allowing you to visualise your sprites in non-parallel modes in the 3D view. (This should help get your fixed orientation right.) | ** View port type will now be used, allowing you to visualise your sprites in non-parallel modes in the 3D view. (This should help get your fixed orientation right.) | ||
− | ** Worked around an infinite loop whereby an | + | ** Worked around an infinite loop whereby an "elapsed time this frame" variable would never decrement if a sprite's frame rate was stupidly low (e.g. 0.001 or 1000 seconds per frame). |
* Object editor window: | * Object editor window: | ||
** Enlarged dialog from 384x240 to 480x320. | ** Enlarged dialog from 384x240 to 480x320. | ||
Line 656: | Line 685: | ||
*** Fixed key/value pairs becoming copied instead of renamed when editing a key. | *** Fixed key/value pairs becoming copied instead of renamed when editing a key. | ||
*** The entity value text box will now wrap its content. | *** The entity value text box will now wrap its content. | ||
− | *** When ENTER is pressed in the value text box instead of CRLF appearing (new line) a literal | + | *** When ENTER is pressed in the value text box instead of CRLF appearing (new line) a literal "\n" will appear. |
* Textures block array: Increased to 16,384 words from 8,192. (This should allow for up to 64 MiB of WAD textures to be loaded into memory.) | * Textures block array: Increased to 16,384 words from 8,192. (This should allow for up to 64 MiB of WAD textures to be loaded into memory.) | ||
* Texture window: The option to stretch textures will now maintain aspect ratio so all textures are still readable whilst using as much space as they can. | * Texture window: The option to stretch textures will now maintain aspect ratio so all textures are still readable whilst using as much space as they can. | ||
Line 662: | Line 691: | ||
=== FGD === | === FGD === | ||
− | * Added entity | + | * Added entity "monster_cleansuit_scientist_dead". |
− | * Added entity | + | * Added entity "monster_gonome_dead". |
− | * Added entity | + | * Added entity "monster_human_medic_ally_dead". |
− | * Added FGD for script entity | + | * Added FGD for script entity "trigger_observer". |
* Added missing and corrected some existing properties to environment sprites. | * Added missing and corrected some existing properties to environment sprites. | ||
− | * Added missing flags to | + | * Added missing flags to "func_monsterclip". |
− | * Added property | + | * Added property "bodygroup" key to "trigger_changemodel". |
− | * Added property | + | * Added property "new_skin" to "squadmaker". |
− | * Added property | + | * Added property "pushmode" to "trigger_push". |
− | * Added property | + | * Added property "triggervalue" to "trigger_relay". |
− | * Added properties to | + | * Added properties to "global_light_control": |
− | ** Add | + | ** Add "target_entity" key. |
** Add comments describing how the entity works. | ** Add comments describing how the entity works. | ||
− | ** Change order of | + | ** Change order of "targetname" and "target". |
− | * Added properties to | + | * Added properties to "item_airtank": |
** Spawn flag 1: Do not explode | ** Spawn flag 1: Do not explode | ||
** Spawn flag 2: Start empty | ** Spawn flag 2: Start empty | ||
Line 692: | Line 721: | ||
** Sound: On is empty | ** Sound: On is empty | ||
** Sound: On refill | ** Sound: On refill | ||
− | * Added properties to | + | * Added properties to "player_weaponstrip": |
** Spawn flag 2: Also strip long jump | ** Spawn flag 2: Also strip long jump | ||
** Weapons list to strip (none = all) | ** Weapons list to strip (none = all) | ||
** Weapons list mode | ** Weapons list mode | ||
− | * Added properties to | + | * Added properties to "point_checkpoint": |
** Spawn flag 1: Reusable | ** Spawn flag 1: Reusable | ||
** Delay before start | ** Delay before start | ||
Line 702: | Line 731: | ||
** Delay before reset | ** Delay before reset | ||
** Show spawn effect | ** Show spawn effect | ||
− | * Added properties to | + | * Added properties to "trigger_script": |
** Spawn flag 2: Self '!activator' (trigger mode) | ** Spawn flag 2: Self '!activator' (trigger mode) | ||
** Spawn flag 4: Self '!caller' (trigger mode) | ** Spawn flag 4: Self '!caller' (trigger mode) | ||
** Spawn flag 64: Keep '!activator' (think mode) | ** Spawn flag 64: Keep '!activator' (think mode) | ||
− | * Added radius figures to small/medium/large spawn flags for | + | * Added radius figures to small/medium/large spawn flags for "env_message", "func_rotating", and "scripted_sentence". |
− | * Added spawn flag 1 to | + | * Added spawn flag 1 to "trigger_effect": Start on. |
− | * All | + | * All "triggerstate" (and alike) properties will be 2 (toggle) by default instead of 0 (off). (Changed for player spawns, "trigger_auto", "trigger_entity_iterator", and "trigger_relay".) |
− | * Corrected item entities (apart from the airtank) wrongly inheriting | + | * Corrected item entities (apart from the airtank) wrongly inheriting "Targetx" instead of "Target". |
− | * Entity | + | * Corrected "squadmaker" key "notsolid", changed to "new_solid". |
− | * Made ultra mega super sure that | + | * Entity "item_inventory" needed to inherit "CustomRespawnDelay" to present a key for a custom materialisation (respawn) delay. |
− | * Marked the | + | * Made ultra mega super sure that "survival.fgd" is included. |
− | * Removed incomplete entities: | + | * Marked the "Force push" flag as deprecated in "trigger_push". (Use "pushmode" property instead.) |
− | * Removed kill target from | + | * Removed incomplete entities: "item_healthcharger", "item_recharge", "monster_flyer_flock" |
− | * Removed landmark name, change target, and delay before change target from | + | * Removed kill target from "trigger_changetarget". |
− | * Removed obsolete entities: | + | * Removed landmark name, change target, and delay before change target from "trigger_changelevel". |
− | * Updated | + | * Removed obsolete entities: "game_player_team", "game_team_master", "game_team_set", "info_intermission", "info_monster_goal", "trigger_autosave", "trigger_endsection", "trigger_transition", "world_items" |
− | * Updated | + | * Updated spawn flag labels for "player_weaponstrip": |
− | * Use correct model for | + | ** Shortened "Also strip suit" to "Strip Suit". |
+ | ** Shortened "Also strip long jump" to "Strip Long Jump". | ||
+ | * Updated "trigger_setcvar" with the correct list of map CVARs it can manipulate. | ||
+ | * Updated "trigger_relay" with use types SET and KILL. | ||
+ | * Use correct model for "weapon_medkit". ("w_pmedkit.mdl", not "w_medkit.mdl".) | ||
=== Map compile tools === | === Map compile tools === | ||
− | * All: Added option to all tools | + | * All: Added option to all tools "-nomapsettings" to bypass compile settings from any "info_compile_parameters" entities. |
* RAD: | * RAD: | ||
** Fixed bounce lighting not always being calculated correctly. | ** Fixed bounce lighting not always being calculated correctly. | ||
** Fixed sunlight angles not always being honoured. | ** Fixed sunlight angles not always being honoured. | ||
− | ** Removed the operation that subtracted the base light (the world light, or light style 0) from other light styles in the | + | ** Removed the operation that subtracted the base light (the world light, or light style 0) from other light styles in the "FinalLightFace" function. This operation was reducing the intensity of other light styles by the amount of the base light. By removing this, each light style now contributes its full intensity, leading to more accurate brightness levels. (This change aligns with the original functionality of prior versions of ZHLT.) |
=== item_inventory test map === | === item_inventory test map === | ||
* Booth 15: | * Booth 15: | ||
− | ** Iron boots item to test avoiding the pushing force of a | + | ** Iron boots item to test avoiding the pushing force of a "trigger_push" whilst wearing them. |
− | ** You can swap | + | ** You can swap "item_name_required" for "item_name_canthave" to reverse the effect, e.g. you must have the item mentioned to be pushed and won't be pushed without the item. |
* Booth 16: | * Booth 16: | ||
** Presents demonstrating self-activated items via the inventory UI. | ** Presents demonstrating self-activated items via the inventory UI. | ||
− | ** The 3 gifts can only be activated | + | ** The 3 gifts can only be activated "unwrapped" once. |
== Other == | == Other == | ||
Line 742: | Line 775: | ||
=== Delta === | === Delta === | ||
− | * Fix issue with | + | * Fix issue with "Entity_Encode" origin precision not matching "Player_Encode" origin precision. |
− | * Increased | + | * Increased "body" value from 8 to 15 so more than 256 body groups can be assigned. |
=== Misc === | === Misc === | ||
Line 752: | Line 785: | ||
** Added HUD chat settings, including the new option to block messages from voice muted players. | ** Added HUD chat settings, including the new option to block messages from voice muted players. | ||
* Christmas event now runs from 24/Dec to 26/Dec (3 days total) down from 24/Dec to 05/Jan (12 days total). | * Christmas event now runs from 24/Dec to 26/Dec (3 days total) down from 24/Dec to 05/Jan (12 days total). | ||
− | * Default map settings configuration: Corrected CVAR | + | * Default map settings configuration: Corrected CVAR "mp_forcespawn", should be "mp_forcerespawn". |
* Default plug-ins configuration: | * Default plug-ins configuration: | ||
** Included admin level restriction in the example for the entity manager plug-in to promote awareness on how it should be safely activated. | ** Included admin level restriction in the example for the entity manager plug-in to promote awareness on how it should be safely activated. | ||
* Linux game client launcher: | * Linux game client launcher: | ||
− | ** Enabled Steam Overlay by default with switch | + | ** Enabled Steam Overlay by default with switch "-nosteamoverlay" to disable it. |
** Make shellcheck.net happy. | ** Make shellcheck.net happy. | ||
− | ** Removed unnecessary library | + | ** Removed unnecessary library "libiconv.so.2" from LD_PRELOAD. |
** Removed URL pointing to the dead forums. (It's dead, Jim.) | ** Removed URL pointing to the dead forums. (It's dead, Jim.) | ||
** Updated year in header. | ** Updated year in header. | ||
Line 764: | Line 797: | ||
** Do not force Steam Runtime library paths when running game outside Steam client. (E.g. from a terminal.) | ** Do not force Steam Runtime library paths when running game outside Steam client. (E.g. from a terminal.) | ||
* Linux SvenDS launcher script: | * Linux SvenDS launcher script: | ||
− | ** Create | + | ** Create "steam_appid.txt" file at root directory (where main binaries are) with the game's application ID (225840) if doesn't exist. |
** Disabled CPU auto detect feature used to pick between i686 and AMD binaries. (AMD binaries are causing issues with config parsing for a couple of server operators, even with dedicated AMD hardware.) | ** Disabled CPU auto detect feature used to pick between i686 and AMD binaries. (AMD binaries are causing issues with config parsing for a couple of server operators, even with dedicated AMD hardware.) | ||
− | ** Workaround for | + | ** Workaround for "Unable to initialize Steam" error on first clean game server start-up. |
* Server settings screen: | * Server settings screen: | ||
− | ** Removed | + | ** Removed "skill" CVAR. |
− | * Shared | + | * Shared "server.cfg" example: |
− | ** Do not set | + | ** Do not set "skillcfgfile" CVAR to non-existent "servers/skill.cfg" non-existent file as it's a bit misleading, and causes noticeable game play faults. |
Latest revision as of 13:11, 24 November 2024
1 Notable changes
- New map: The Mustard Factory
- Added auditing to player spray uploads.
- Brought back borderless window option.
- Major overhaul to heavy weapons grunts.
- Major overhaul to third person camera.
- New "trigger_observer" script entity.
- New "func_vehicle" native entity.
- Players can now be voice muted without having to block text chat too.
- Significant quality of life updates to Svencraft map editor.
2 Code
2.1 Game library
- Added cheat command "entityinfo":
- Works the same as "myinfo" and "thatinfo", but expects either target name or entity index afterwards.
- For entity index queries prefix the number with a hash '#'. (For example "#50" for entity index 50.)
- This will print entity information for all entities found with the specified target name, or just the one at the entity index.
- Added colours cyan, green, magenta, and orange to the text menu.
- Added graceful error message when a null entity or class name empty entity is spawned.
- Added player command "hud_reset" so they have a way to try and work around the uninitialised HUD when joining. (Subject to the player command retry limit to avoid flooding.)
- Added server command "as_plugins", a server console equivalent to client command "as_listplugins". (They couldn't have the same name.)
- Added server command "showmapvotelist" to see what maps can be voted for.
- Adjusted the default bounding box size for battery and inventory item entities to make them less likely to disappear into walls.
- All entities will now preserve their original rendering properties (mode, amount, colour, and effect) during the pre-spawn function instead of just players and particular NPC entities.
- Allow "mp_footsteps" to be set by map config files.
- ambient_music:
- Added support for explicit use types for activator-only mode music.
- Better notice of being explicitly turned on/off instead of toggle only for everyone music.
- Use type "SET" will accept the float value to start playing from an exact offset.
- Ammo entities: Reduced default size to match small items (such as batteries) allowing them more room before being declared to be stuck in the wall.
- Beams & lasers:
- Added explicit use type support to "env_laser".
- Do not apply damage taking shake effect to players if the beam/laser does zero damage.
- Blocking doors, platforms, rotating, and train entities with zero crush damage no longer tries to inflict zero damage on the blocker. ("TakeDamage" function won't be called.)
- Blocking doors, platforms, rotating, and train entities with negative crush damage will call a "TakeHealth" function instead of "TakeDamage".
- Breakable entities will store the damage inflictor in entvars `pev->dmg_inflictor`.
- Brought back borderless window option "r_borderless", which works with SDL instead of Windows API.
- If this option is enabled [1] and the window size matches the screen resolution the window will become borderless.
- Removes the bottom rounded corners exposing the task bar colour on Windows 11.
- cl_showstats: The client and server address have been flipped when running a listen server, because the engine reports "local_address" as the server socket instead of the client socket.
- Cross-map inventory will now work with LAN players by tracking them using their IP address and port number: This should fix players losing their cross-map inventory in LAN games if the player needed to disconnect to retrieve content, particularly via HTTP, but only if the client doesn't change their outbound port number. (Usually true in LAN games as there is no P-NAT between the client and server randomising this.)
- dropitem command: Fixed pointer corruption when dropping an item while holding multiple items.
- env_fade/env_message: Pass the original activator to `SUB_UseTargets()` instead of itself.
- env_glow/env_sprite: Implemented "framestart" key.
- env_spark: Obey explicit trigger use types when the toggle flag is enabled.
- Fixed a (rare) crash when a base entity has no entvars `pev`, but its class name or target name is asked for.
- Fixed a crash when one entity checks if it should intersect with another, but the other entity is null.
- Fixed a crash when passing a null pointer to `RemovePlayerItem()`. (Thanks Outerbeast.)
- Fixed a crash with breakables when the inflictor is null.
- Fixed a potential null pointer deletion when destructing a player entity.
- Fixed an invalid debug assertion within `CBaseEntity::Instance()` so that it's possible to check if an entity instance (still) exists.
- Fixed armor HUD not disappearing when entering in observer mode.
- Fixed button sparks appearing in the centre of the world instead of where the button is.
- Fixed entities with a "keep activator" flag active not working as expected if the original activator was not a player, and the entity had a delayed activation. (Such as a "trigger_relay".)
- Fixed incorrect deploy method calls and ensure proper sentry deployment behaviour.
- Fixed issue preventing upward-facing players from ascending ladders. (On-ground check was aggressively setting the player's origin to the floor, even if they were on a ladder.)
- Fixed Opposing Force mortar controller unintentionally modifying non-"op4mortar" entities during its set-up.
- Fixed respawning pick-up entities (such as ammo) not retaining their original render amount and render mode properties.
- Fixed some crashes caused by uninitialized variables or division by zero in HUD messages.
- Fixed negative numbers not passing the "Is String a 3D Vector" test.
- Fixed spore grenade using the wrong hull. (It should be point size.)
- Fixed studio model box calculations.
- Fixed player spawn point selector not guaranteeing an empty spawn point when one is available.
- Fixed players taking damage (including death) from fall damage when god mode is on.
- Fixed pre-caching of sky maps adding corrupted resources to the pre-cache list.
- Fixed unintentional "click" action when releasing the scoreboard after clicking the mouse. (Often caused unintended weapon firing.)
- Fixed visual disturbance when switching quickly between first and third person.
- func_camera/func_mirror/func_portal:
- Fixed regression with portals not rendering player model while in first person. (If portals are currently being rendered, skip the player model draw bypass check.)
- Fixed rendering never working when a minimum or maximum distance is specified. (If the entity is brush based it will still need an origin brush attached to the model.)
- Spawn flag "SF_PORTAL_SHOOT_THROUGH" now only applies to portals. (Not cameras or mirrors.)
- func_clip/func_monsterclip:
- Added support for SET and KILL use types.
- Apply the FL_MONSTERCLIP flag if the SF_MONSTERS spawn flag is defined. (Not just if the entity class name is "func_monsterclip".)
- Fixed the "start off" flag not working.
- func_guntarget: Change classification to none from machine so that NPCs ignore it by default, though also support mappers choosing a classification of their choice.
- func_pushable:
- Restored legacy "size" key specifically for older maps that use it if they don't have a compiled hull size. (E.g. for aligning the focuser emitters in Half-Life: Blue Shift.)
- Added logic to select the hull alignment method.
- Mappers can now specify "SOLID_BSP" solid type for more precise collision rather than "SOLID_BBOX"'s generic bounding box collision.
- Updated push calculations: Checks if the goal move velocity length is zero before proceeding, and also ensures the velocity does not exceed the maximum speed.
- func_tank:
- ACT_IDLE_ANGRY now used by NPCs when operating instead of a casual idle animation.
- Calculate the distance from their centre to their bounding box maximum more reliably.
- NPCs now calculate the standing position in real time, accounting for the direction it's currently facing.
- func_tanklaser: Prevent from killing allies of the operator or the operator them self.
- func_train:
- Fixed moving sound not stopping if the train is halted whilst between path points.
- More useful message when a train has no first position target.
- func_vehicle: Ported native entity from Counter-Strike. (Re-implementation.)
- HUD: Added hide flags for crosshair "HIDEHUD_CROSSHAIR" and ammo "HIDEHUD_AMMO".
- Network message for hide HUD flags "HideHUD" now writes a single short instead of a single byte to accommodate for more than 8 flags.
- HUD: Changed hide flags "HIDEHUD_HEALTH" and "HIDEHUD_SUITPOWER" to hide their respective information from the scoreboard.
- HUD: Text chat messages will no longer be blocked from voice muted players as standard.
- Boolean CVAR "hud_saytext_block_muted" will let players decide if they want text chat blocked from voice muted players.
- This setting is turned off by default (0), meaning when players are voice muted their text chat will still be seen.
- HUD: Info text tweaks.
- Added neutral colour/prefix for when an NPC is neither friend or enemy, instead of assuming they're enemy. (Uses our brand cyan/azure colour.)
- Fixed doors showing the wrong text (as if they are a monster) when they weren't breakable.
- Reduce HUD next time to 125ms from 200ms for slightly faster updates in dense battles.
- Improved players maximum speed not always updating:
- Help ensure player speed is reset according to "sv_maxspeed" when being forcibly respawned by a map.
- This improves reliably slightly, but only if the new maximum speed is less than "sv_maxspeed".
- This should help maps that want to change player maximum speed with the "sv_maxspeed" map CVAR for specific parts of their map only, though it still requires mappers to trigger their entities in the correct order.
- Improved string append performance. (Modest performance increase to the node graph generation, noticeable for big maps.)
- Libcurl updated to 8.5.0 with zlib (1.3), asynchronous DNS (c-ares 1.25.0), HTTP/2 (nghttp2 1.58.0), and OpenSSL 3.2.0.
- Linux build includes OpenSSL 3.0.5. (No more needing to manually install "libssl1.1".)
- Windows build still uses SCHANNEL, however Windows Vista and Server 2008 will no longer be supported.
- Linux: Build architecture changed from "i486" to "pentium4". (This effectively enables SSE and SSE2 extensions sets.)
- Map configuration:
- Added support for "ammo_9mmAR", "ammo_mp5clip", and "ammo_9mmbox" entities.
- Allow support for all ammo_* entities.
- mapinfo command: Corrected CVAR "mp_forcespawn", should be "mp_forcerespawn".
- monstermaker/squadmaker:
- Fixed NPCs becoming stuck when spawning inside each other.
- Now stores the monster class name in the "noise" entity variable. (Allows scripts to know what entity they are spawning.)
- Node graph brush entity blocking a link handling: Do not allow monsters to go through doors that are locked by a master or do not fulfil its inventory requirements.
- Optimized collision tests for objects intersecting players.
- Particles: Check for empty string when running a muzzle flash particle. (Fixes a Linux specific crash.)
- Physics entities: Do not apply fall initialisation when the move type is none.
- Player:
- Corrected LAN mode check to match how the engine does it.
- Fixed player blood colour, class name, gravity, long jump, and team being reset unintentionally.
- Fixed player effects not being persisted when revived. (E.g. from an item providing effects you are allowed to hold on death.)
- Local player will no longer be rendered if in first person mode unless looking through another entity.
- Player entity: Added virtual read-only keys "adminlevel", "authid", and "xtralevel" of which can be read by "trigger_condition".
- Player entity: Two players (or more) can be marked as non-colliding by setting key "iuser4" to an integer higher than zero:
- This must be applied to both players. (If one player does not have it they will collide.)
- Maps can set this by adjusting key "iuser4" on the player. (E.g. via a "trigger_changevalue".)
- Scripts can set this via the "entvars" structure. (E.g. `pPlayer.pev.iuser4`.)
- Known issue: There will be a tiny bump between the two players for one frame when they begin to enter each other's space, then proceed to not collide.
- Known issue: If you are crouched while non-colliding you can't stand up until you both leave each other's space.
- Player movement:
- Reference "clientmaxspeed" instead of "maxspeed" when clamping movement speed for air, ladder, walk, and water. (This allows a positive speed multiplier effect such as from "item_inventory" to work without needing to increase "sv_maxspeed" and apply a bunch of tricks to lower everyone else's maximum speed.)
- When exiting water at a vertical edge, increase jump velocity from 225 to 240. (Fix for being unable to climb vertically out of water on legacy maps, such as the shark tank on Incoming.)
- Player spawn points: Fixed spawn point targets being unintentionally triggered by cascade when the spawn point itself was being turned on/off.
- Players are now invulnerable during the end of map intermission.
- Print entity info commands:
- Show angular velocity, velocity origin, maximum speed, scale, sequence, gait sequence, frame, animation time, frame rate, and rendering (mode, amount, colour, and effect) properties.
- Show flags for effects, main edict, spawn, and weapons.
- Player: Show if collision is disabled. (iuser4)
- Player: Show if jumping is blocked. (fuser4)
- Restored bullet hit sound effects.
- Studio model event: Check for empty event options string for client side sound (5004) and custom muzzle sprite (5005 and 5006) before attempting to use it for a sound or particle.
- squadmaker:
- Add key "new_skin" to set the model's skin number. (-1 to ignore, just like for "new_body".)
- Fixed "new_body" not marking its key as handled when processed.
- Removed "nonsolid", replaced with "new_solid" to set the solidity of child entities. (Just fixing "notsolid" caused too many conflicts with legacy maps.)
- Third person camera overhauled:
- Holding the ALT key while in third person now provides better and more modernised control over the camera.
- ALT + mouse move: Rotate the camera.
- ALT + mouse scroll: Zoom in/out.
- ALT + E: Save camera angles, with a confirmation sound and console message. (Not saving any new camera angles will transition the third person camera back to your last saved settings.)
- New CVAR "cam_reset_time" to reset the camera after rotating. (Default: 2 seconds)
- New CVAR "cam_max_dist" sets how far the camera can zoom out. (Default: 512 units)
- Collision detection and smoothness are greatly improved by using precise point content queries instead of hull traces.
- Seamless transitions between first and third person now occur when space is limited. (E.g. crawling in a vent.)
- Third person view with weapon zoom automatically switches to first person.
- Camera rotation is locked to +/- 60 degrees when using "cam_followaim" aka "Look at Crosshairs".
- Holding the ALT key while in third person now provides better and more modernised control over the camera.
- trigger_change_class: Add support for "!activator" and "!caller". (Thanks Outerbeast.)
- trigger_changelevel: Float-safe clamp when reading "percent_of_players" key.
- trigger_changemodel: Fixed not applying the desired skin. (Thanks Outerbeast.)
- trigger_changetarget: Fixed only applying to one entity instead of all entities with the matching target name. (Thanks Outerbeast.)
- trigger_createentity: Fixed not pre-caching the entity it's going to create. (Thanks Outerbeast.)
- trigger_effect: Added spawn flag to begin with the effect starting on.
- trigger_push:
- Fixed velocity check for negative directions when force push mode is on.
- Fixes for when the "push once" spawn flag is set:
- The workaround for upward lifting things on the ground will now also apply.
- Support for both of the force push modes. (Even if the velocity is still only transferred once.)
- If a pushable has more intricate collision (when solid type set to SOLID_BSP), ensure that they aren't skipped if their move type is MOVETYPE_PUSHSTEP (e.g. a pushable object). This does not affect older levels, only levels moving forward that have pushables with their solid type set to SOLID_BSP instead of SOLID_BBOX.
- Implement inventory rules. Implemented in inverse, so matching the rules will PREVENT being pushed. (Behaves the same as "trigger_hurt", whereby matching the rules blocks damage.)
- Improved efficiency of force push mode by using dot product to check if minimum velocity is already achieved before amending velocity.
- New push mode "pushmode" choice property to accommodate a new exact velocity of pushing.
- Regular (0): The standard. Can be resisted by the pushed thing trying to move or interfering physics.
- Forced with minimum velocity (1): What we called "force push" (flag). The pushed thing can move faster than specified, but not slower. (Accepts some gravity/friction interference.)
- Forced with exact velocity (2): New mode. The pushed thing can only move at exactly the velocity specified, no faster or slower. (Defies gravity/friction entirely.)
- (The "force push" flag is deprecated in favour of the choice property, though the flag will still work in existing maps unchanged.)
- Updated SDL to 2.30.1 (5th March 2024) from 2.0.0 (13th August 2013):
- Fixes various issues with mouse input on Linux systems. (Such as mouse scroll acting as "mouse4" and "mouse5".)
- VGUI:
- Inventory screen buttons no longer have a gap before their text. (This particularly fixes the close [X] button at the top right appearing empty on lower resolutions.)
- Tinted green team's colour towards cyan a bit so that it's less similar to yellow.
- VGUI command button: Added property "no empty bound key gap" to disable the 5 spaces being prepended to buttons that don't have a key bound to their action, but don't want a gap. (This allows buttons to have centred text without there being obscure left padding offsetting the text on the left side.)
- Voting tweaks/fixes:
- Do not allow kill votes towards observers or dead players.
- Do not allow votes to target players not fully connected yet.
- Fixed a few vote denied messages being shown to everyone instead of just the person trying to do it.
- Fixed vote commands not being subject to the client command cool-down period.
- Show percentage required to players for a vote to pass after the question.
- When a player is killed forcibly by the server rules ensure the player is always gibed, regardless if the player is dead or alive. (Fixes exploit whereby a player can evade the imposed respawn delay from kill vote by suiciding before the vote succeeds and being revived by a friend. The player will now always gib, forcing them to wait the extended respawn delay.)
- When a player connects to a server the contact info (sv_contact), if available, will be printed in their console. (For listen servers the name and Steam ID of the hosting player will also be printed.)
- Xen teleport beam: Fixed only 1 beam being created instead of the intended 10.
2.2 AngelScript
- Angelscript API updated to version 2.36.1. (See changes here: www.angelcode.com/angelscript/changes.php)
- Added colour definitions for a wider range of colour palettes: X11/web standard, Windows 20, and Sven Co-op brand.
- Added CVAR "angelscript_compiler_treat_warnings_as_errors" for configurable compiler warning behaviour:
- 0: Warnings are printed to console. (New default.)
- 1: Warnings will be treated as errors, printed to console, and halt script compilation. (Recommended for production releases.)
- Added hook "PlayerRevived", fired when a player is resurrected by another player or NPC.
- ASPlayerEntity: Corrected signature of function `RemoveAllItems()`. The two bool parameters are implicitly false if unspecified.
- CASPlayerFuncs: Abort `ClientPrint()` if `pPlayer` is null.
- Corrected documentation for `BestVisibleEnemy()`.
- Corrected documentation for `CSprite::Frames()`: Returns an `int`, not a `float`.
- Corrected exposed type of `CItemInventory::m_szDisplayName` to match the actual class member type. (string_t)
- DateTime objects:
- Added support for leap second. (Max value is 60 instead of 59.)
- Added support for daylight savings time flag. (`int GetIsDst()` and `SetIsDst(int)`).
- Corrected range for `SetDayOfMonth(int)`, this should be 1-31 instead of 0-30.
- Added clamp for `SetMonth(int)` at 1-12.
- Corrected documentation for some of these set/get functions, particularly expected value ranges, and alignment with the AngelScript base.
- Expose `CBaseWeapon::Reload()`. Only called when `Reload()` is called.
- Expose `CBaseEntity::OnSetOriginByMap()`. This allows you to reset the default position of say a door or "item_inventory" after moving it with your script.
- Expose `CItemInventory::TryCollect()`. This is the ideal way to make a potential item holder pick up an "item_inventory" remotely.
- Expose `COLLECT_TYPE` enumerator.
- Expose `DROP_TYPE` enumerator.
- Expose `EFLAG` enumerator and helper functions that can be used by entities to not collide with friendly or to ignore "trigger_gravity".
- Expose `HIDEHUD` enumerator.
- Expose `m_dropType` so DROP_TYPE enum has something to be used with.
- Expose missing constants `EF_SPRITE_CUSTOM_VP`, `EF_FULLBRIGHT`, and `EF_NOSHADOW` for the `EFFECTS` enumeration.
- Expose `MonsterKilled()` and `MonsterTakeDamage()` hooks. (These are equivalent as the player hook counterparts.)
- Expose the map the server is changing to in `OnMapEnd()`.
- Hook "MapChange" now receives a string to reveal which map the server is about to change to, or empty if the server is shutting down.
- ALL scripts listening for this "MapChange" event will need an update. Just add a parameter for a string to receive the new map.
- Expose `VP_TYPE` enumerator, with its map counterpart `MAP_VP_TYPE`.
- Fixed a crash when attempting to remove an "item_inventory" from a holder, either via `Drop()`, `Return()` or `Destroy()` functions on the item entity.
- Fixed a crash with Item Mapping arrays if there's a trailing comma at end of the list.
- Fixed a lot of missing variables from the "item_inventory" documentation. (Mostly for self-activation enabled items.)
- Fixed a potential crash whereby a script removes a scheduled function from the scheduler but then erases the variable it was stored in (by `= null`) before the next frame.
- Fixed model interpolation logic (physics issues):
- Fixes an issue where the collision logic sometimes thinks an NPC is a player.
- Fixes players getting gibed if they were standing in corpses near doors or rotating objects.
- Function `CBasePlayer::RemoveAllItems()` now takes a second boolean to remove long jump.
- ALL scripts calling `CBasePlayer::RemoveAllItems()` will need an update. Just add a boolean `true` to remove long jump or `false` to let the player keep it.
- Player functions: The HUD text parameters channel now matches the behaviour of "game_text" whereby map scripts will be remapped from 1-4 to 5-8 implicitly, so that server plug-ins can remain using channels 1-4 relatively conflict free of map produced messages. (All scripts should continue to use text channels 1-4 as they already do.)
- Re-think of how server plug-ins are included/excluded on a per-map basis to correct a few quirks across map changes.
- CVAR "plugin_list_file_persistent" is no longer required and has been removed.
- RGBA structure:
- Added constructors to take in a vector with optional alpha channel. (255/opaque assumed if unspecified.)
- Added function `opEquals()`: For comparing two RGBA instances.
- Added function `ToString()`: To output an RGBA object as "r g b" string, or with optional alpha channel to output "r g b a" string.
- Added utility function `StringToRGBA()`: Converts a string to an RGBA structure. String must be formatted in RGB as "%d %d %d" or "%f %f %f", or in RGBA as "%d %d %d %d" or "%f %f %f %f". (If RGB is provided the alpha channel will be assumed as 255.0f/opaque.)
- Scheduler: Fixed incorrect assertion fail when an infinitely repeating schedule is used.
- Server plug-ins: Implemented "maps_excluded" properly to work across map changes.
- Server plug-ins not loaded due to "maps_included" or "maps_excluded" rules will now print a regular message instead of an error in the console.
- trigger_relay:
- Added support for SET and KILL use types.
- Added "triggervalue" key for a numeric value to relay, usually for the SET use type.
- trigger_script: Added flexibility on what is exposed as the activator to the script:
- In trigger mode new spawn flags 2 and 4 allow passing the entity itself as activator and/or caller instead of the original activator/caller. (Opposite to the "Keep activator" spawn flag in other entities like "trigger_relay".)
- In think mode new spawn flag 64 will remember the original activator as `EHANDLE m_hActivator` so that `!activator` can be kept. The script entity itself is still passed as an argument to the script function, but the script can read the entity's `m_hActivator` to obtain the original activator. (If the flag is off the script entity will be the activator.)
- Entity class "trigger_script" is now exposed to scripts so that it can be cast from `CBaseEntity@` into `CTriggerScript@`, which is necessary to read the `EHANDLE m_hActivator` in looped think mode.
- When a plug-in is not compiled because it already exists in the list (e.g. after a map change) simply skip it, don't report it as a failed compile.
2.3 Engine
- Added auditing to player spray uploads:
- Write a server log entry when a file uploaded is accepted from a player, including the MD5 checksum, which can be matched via command "hpklist".
- Write a custom HPK log "custom.hpk.log" line with a consistent list of MD5 checksums uploaded along with a date/time, user ID, Steam ID, and player name.
- (Use the "hpklist" and "hpkextract" commands to export the uploaded spray in WAD format.)
- Added conditional smoothing for light styles: Activates when the last character in the light entity's "Custom Appearance" pattern is "~".
- Added CVAR "viewmodel_fov" to independently adjust the field of view for a player's weapon viewport model.
- Added debug feature to draw bounding boxes around local physics entities in the player movement simulation when `r_drawentities` is set to 7.
- Block Powershell scripts from being downloaded in game. (.ps1)
- Command line processor:
- Only calculate parameter and value lengths once.
- Fixed CVE-2023-30382. (Limits command line parameters to their intended maximum buffer size of 4096.)
- If a value is non-empty and begins a hyphen '-' wrap the value in "quotes", and allocate 2 extra to the length of the new command line string.
- Dedicated server launcher:
- Always include "log on" to the primary in-server command list.
- Always wrap the chosen map in "quotes".
- Fixed a few unsafe string copy operations.
- Enhanced entity collision for possible hulls inside walls or objects:
- The hull is now always centred on the entity's origin for the X and Y axis.
- Avoids entities erroneously disappearing into a wall or falling through the floor even when there was plenty of room.
- Attempt an 4 unit nudge in all directions for the X and Y axis if the initial trace was found to be all solid. (This allows entities some margin of error before being declared "stuck in the world" and falling out of the map.)
- Engine new DLL functions version 2:
- Added `pfnChangingLevel( const char *level )` to inform the game DLL when the engine is about to change level, and more importantly, to WHICH level.
- This will allow the game DLL to react/prepare for the next level about to start. (`level` will point to null if no next level is due, e.g. when the server is closing down.)
- Implementation for `pfnChangingLevel()` when the server thread shuts down:
- Commands "reload" and "restart" will pass through the current level name.
- Commands "changelevel" and "changelevel2" will pass through the new level name if it's valid.
- Ensure gravity is always applied in the physics simulation for "MOVETYPE_PUSHSTEP" and "MOVETYPE_STEP" entities to prevent them from flying off into space. (Gravity is now always applied, regardless of whether the entity was believed to be on the ground in the previous frame.)
- Fixed a batch of potential buffer overflows discovered when fixing CVE-2023-30382.
- Fixed a null pointer dereference in `NET_GraphValue()` when the client DLL doesn't make a declaration for keyboard command "in_graph" and "+graph" is activated whilst "net_graph" is active.
- Fixed a null pointer exception if `PvAllocEntPrivateData()` or `FreeEntPrivateData()` is given a null edict.
- Fixed a pointless constant recalculation of a model's scale when it never changes.
- Fixed an exploit whereby player IP addresses can be revealed to other players whilst connected to a server (even if non-P2P) that they don't operate:
- A P2P socket will now only be opened when a player is running a listen server or connects to a P2P game address.
- All existing sockets (IP and P2P) will now be explicitly closed when disconnecting from any game server, so that any UDP listening socket you had open whilst you were in a P2P game will not still be open if you move to a non-P2P game.
- Added console messages "Closed IP networking." and "Closed Steam P2P networking." so players can see some assurance of when these happen.
- Fixed an exploit with client resource uploading.
- Fixed an exploit with resource consistency checking.
- Fixed an issue with pushables falling through the floor due to having a larger bounding box than world hull size.
- Fixed an issue with remapped skins not supporting "STUDIO_NF_MASKED". (Texture flag is now checked when the texture is re-uploaded to GL.)
- Fixed scrolling/conveyor texture speed to account for texture scale. (Ensures objects on a conveyor belt move at the same speed as the texture's scroll rate.)
- Fixed empty pre-cached files in the server preventing players from joining.
- Fixed file system API being unable to find a file if path contains a non-existent directory followed by "/../" on Linux systems. (Also fixes issue with AngelScript failing to include files containing dot-dot-slash in file path.)
- Fixed glitchy visual popping for NPCs that walk or run while being moved. (E.g. by falling or being pushed by something.)
- Fixed hull size selection regression that caused some BSP models to get stuck inside walls or other objects.
- Fixed IP socket being wrongly created when "-noip" launch parameter is specified when joining a 2nd+ game.
- Fixed listen server not being gracefully shut down prior to the engine being restarted. (Such as when changing screen resolution.)
- Fixed player weapon view port model clipping back into their own vision/camera.
- HPAK commands:
- When showing the contents of a HPAK use the real index of each item rather than a number starting from zero. (The real index is what you pass to "hpkextract" and "hpkremove", rather than being 1 out.)
- hpkextract: WAD file names written changed from 4-zero to 5-zero, as the limit for a HPK is 32768 entries.
- hpkextract: Show the MD5 checksum of the lump being exported so you can see it matches what you saw in "hpklist" and the recently added upload audit.
- HTTP content downloader: Audit the HTTP response status code. (Include in console error message.)
- Implemented point hull and left-aligned hull collision options via new spawn flags:
- SF_FORCE_POINT_HULL_FOR_BRUSH_MODEL_COLLISIONS (16,777,216): Force the engine to use the point hull when performing collision tests against brush models.
- SF_FORCE_LEFT_ALIGNED_HULL_FOR_BRUSH_MODEL_COLLISIONS (33,554,432): Use the original left-aligned hull alignment algorithm for collision tests against brush models.
- Increased length limit of "sv_downloadurl" to 1,740 from 127. (Matches 2000 as per RFC 9110, the maximum path length of 260 expected to be appended to this base URL.)
- Increased MAX_PACKET_ENTITIES to 1024 from 512.
- Increased MAX_PHYSENTS to 1024 from 600.
- Increased MAX_VISEDICTS to 1024 from 512.
- Light maps will be rebuild when "gl_overbright" is changed at runtime.
- Linux dedicated server binaries for AMD x86-32 will no longer be provided. (They were buggy, and frankly unnecessary. Use the i686 binaries instead.)
- Server: Resources will be checked if they're too big to be transferred without opening a handle to them.
- This should improve an issue whereby a server will hang/stall momentarily when a download request from a client is refused due to being too large as per "sv_filetransfermaxsize".)
- This will depend on which file system module is being used by the server (internal/stdio or Steam), as we can only improve this for the internal/stdio file system.
- Server: When no IP address is explicitly specified (with "+ip") on a system with multiple network interfaces, and the game is multi-player ("maxplayers" >= 2), bind to "0.0.0.0" (all network interfaces) instead of "localhost".
- Svengine server interface version 2: Added function `GetPlayerAddr()` to retrieve a player's IP address (and optionally port number) after the player has completed their initial connection.
- Updated how the server checks for client IP address restrictions in LAN games:
- Accept the default IPv4 network (0.0.0.0/8) and default IPv6 address ("::" or "0000:0000:0000:0000:0000:0000:0000:0000") as a reserved address.
- Check that both server and client are reserved addresses, not just the client.
- If either the server or client addresses aren't reserved attempt a prefix match instead. (Currently only Windows servers will do this.) This adds support for LAN games to happen outside of reserved addresses from RFCs 5735 and 5156. (E.g. a player with an IP address within "200.50.10.0/24" can join a server also in this same local subnet.)
- More useful disconnect message when these checks fail: Reference RFCs 5735 and 5156 instead of the out of date "Class C".
- Updated SDL to 2.30.1 (5th March 2024) from 2.0.0 (13th August 2013):
- Fixes various issues with mouse input on Linux systems. (Such as mouse scroll acting as "mouse4" and "mouse5".)
2.4 Sound
- Sound files are now automatically transferred to clients without a need of a RES file. (Does not include client side sound events in models.)
2.5 Non-playable characters
- AI: Fixed a long-standing problem (since 3.0) where NPCs could still hear players after they were killed. (This was making the AI respond to dead players for unlimited periods of time. Now, when a player is killed, their sound is turned off properly.)
- Dead NPC entities:
- Fixed a crash when an out of bounds pose was specified.
- Remove the entity if an invalid sequence is specified. (E.g. pose sequence name not found in a custom model.)
- Female assassin:
- Corrected incorrect evaluation of skill setting "sk_hassassin_enable_cloaking", which considered anything less OR EQUAL to 1.0 to be disabled. (This should have just been anything less than 1.0. Equal to 1.0 is meant to mean on/yes to cloaking.)
- Fixed dropping multiple handguns when dying when classic mode is enabled.
- Fixed "MonsterKilled" hook being triggered multiple times or when gibing a corpse.
- HWGrunt: (Major overhaul)
- Don't drop minigun when taking 50+ blast damage if the NPC's "disable drop minigun" option is active.
- The enemy selection logic has been improved, along with the handling and operation of the minigun firing tasks.
- If a friendly entity is blocking the HWGrunt's line of fire, the HWGrunt will now vocalize a sentence.
- Added a stun time of 3 seconds is applied when the minigun is dropped. This happens under certain conditions:
- When the damage type is a blast, the entity is armed with a minigun, new animations are enabled (e.g. not a legacy HWGrunt model), and minigun drop is not disabled.
- If the damage exceeds 50, there's a 90% chance that the minigun will be dropped, triggering a 3-second stun time during which the HWGrunt cannot fire its pistol and will retreat.
- After defeating an enemy the HWGrunt now performs a victory dance, which involves walking over to inspect the defeated enemy. Afterwards, the HWGrunt will run back to its original location.
- A bug has been fixed where the HWGrunt would not dismount from a rope at the appropriate time when spawned as "monster_hwgrunt_repel". The "ACT_GLIDE" animation ("repel_repel") had an excessive number of frames. The HWGrunt now checks more frequently to decide when to dismount.
- A new ammo pack hit group has been added located on the HWGrunt's back, which acts as armor against incoming attacks.
- Attacks to specific hit groups, such as the stomach or chest, now behave similarly to other Human Grunts.
- The bullet damage modifier, which previously reduced bullet damage by 70% and pushed the NPC away from the attacker in an unnatural manner, has been removed.
- If the scale key is less than or equal to zero upon spawn it is now properly initialized.
- Minigun firing rate has been slightly increased. (Firing delay reduced from 0.8 to 0.7.)
- Minigun firing position has been adjusted.
- Now aims up and down more consistently when firing or spinning up the minigun.
- Kingpin: Attempt to avoid teleporting into an active monster clip brush (including "func_clip") and an active "trigger_hurt" of which will do damage to the kingpin.
- Male assassin: Fixed animation when dying in water.
- Robot grunt:
- Fixed a crash when taking damage if the inflictor is null and robot is glowing due to being close to destruction.
- Fixed a freeze with the robot's death animation.
- Fixed shock glow damaging the player that threw a crowbar at it.
- Scientist (sitting): Fixed display name being empty if a mapper doesn't explicitly set one.
- Sentry turret:
- Fixed being unable to attack while deploying if it is touched or damaged.
- Fixed being unable to see targets if touched or damaged immediately after spawning.
- Fixed client-side rendering issue during spawn.
- Simplified and improved NPC aiming mechanic: This addresses an issue where certain NPCs, such as the HWGrunt, were unable to hit players who were too close.
- Opposing Force grunts:
- Remove moving and shooting ability.
- Improved M249 full-auto firing support for older models: The "saw_standing" animation used by the SAW Grunt is now analysed during spawn to ensure the firing event is at frame 0. If not, the model is deemed incompatible with the full-auto firing mechanic.
- Osprey: Stop rotor sound when destroyed.
- Xen tree: Do not attack dead or non-solid stuff.
2.6 Weapons/Items
- Ammo entities preserve their original rendering properties after respawning.
- Crowbar will no longer show on-screen messages regarding electric use/state.
- Do not automatically refill a dropped weapon's primary ammo clip when picking it up.
- This applies to picking up a weapon dropped by player on command or player on death.
- Fixes an instant reload exploit.
- Health and HEV wall chargers:
- Clarified that custom recharge time "-1" means instantly recharge, not never recharge.
- Added custom recharge time "-2" to mean never recharge once depleted.
- Improved the mechanics of MADWHACK, to make shotgun and explosive attacks more impactful:
- For lethal "DMG_LAUNCH" attacks on NPCs the force is a minimum of 256.
- For lethal and non-lethal "DMG_BLAST" attacks on NPCs a minimum force of 256 is now applied and capped to 512.
- For non-lethal "DMG_LAUNCH" attacks on NPCs a maximum force of 256 is now applied.
- Modified the damage force calculation to cap the maximum force to 512, preventing excessively large forces.
- Re-factored damage force function to account for the type of damage. The function now accepts an additional parameter for damage type and applies a different scale factor for blast damage, leading to a more accurate representation of the damage force.
- Item entities will automatically change its hull to point size if they appear to be stuck in the solid world. (E.g. in a very cramped space.)
- item_airtank:
- Added key "air_time_given" to change the default 12 seconds of air time provided on use.
- Added key "refill_delay" to change the default 30 seconds refill delay. (If this is -1 then the air tank can only be used once, it never refills automatically, and just becomes a sitting explosive or prop.)
- Added keys for custom sounds:
- sound_on_consume
- sound_on_is_empty
- sound_on_refill
- Added keys for event triggers:
- target_on_consume (player is activator)
- target_on_is_empty (player is activator)
- target_on_refill
- target_on_destroy
- Added spawn flag 1: "Do not explode", prevents the air tank taking damage and exploding, if a mapper wanted one static minus the trolling.
- Added spawn flag 2: "Start empty", spawns the tank with no air in it. (It must be refilled by a trigger.)
- Default health/strength (20) can now be set with the "health" key.
- Fixed sound "doors/aliendoor3.wav" not being pre-cached.
- Fixed the empty sound playing every frame by keeping track of when the air tank was last touched, with a 3 second cool-down delay between each accepted touch.
- Implemented "+use" activation, with spawn flags "TOUCH only", "USE only", and "Can Use w/o LoS" as per other item entities.
- Implemented explicit trigger USE types:
- OFF will set the air tank to be empty.
- ON will set the air tank to refill in the next frame.
- SET is for "+use".
- TOGGLE will allow a player to consume the air tank remotely by a trigger. (E.g. via a button elsewhere.)
- KILL will destroy the tank. (Pass in value 1 to explode the tank providing the "Do not explode" spawn flag is not set.)
- item_inventory:
- Fixed delay between self-activations "holder_time_activate_wait" working the wrong way around.
- Fixed internal "last activated" time not being reset when the item is dropped or re-materialised.
- Fixed trigger on wear-out firing significantly sooner than expected for self-activated items, often immediately on collection or activation.
- item_security: Fixed a race condition whereby the item can be picked up twice by touching it and +use-ing it at the same moment really quickly.
- Long jump:
- Fixed physics flag "slj" not being reset to 0 when a player spawns. (Kept as is when a player is revived.)
- Added rudimentary way of optionally turning off your long jump with command "togglelongjump". This is designed to be a temporary choice, and will reset to the standard ON whenever you respawn or pick up a long jump module. (Physics flag "nolj".)
- monster_handgrenade: Fixed being revive-able by a player's medkit.
- player_weaponstrip: Added ability to strip/ignore specific equipment:
- Added spawn flag 2 "Also strip long jump" to also the long jump from the player.
- Added key "weapons_list" to accept a list of specific weapons to strip, e.g. "weapon_crowbar;weapon_m16".
- Added key "weapons_list_mode" to choose how the above list works: 0 (inclusive) to only strip those in the list, or 1 (exclusive) to strip all NOT in the list.
- Satchel charges are now easier to throw towards narrow gaps. (They will no longer float 4 units above the ground, and will use the point hull size.)
- Snark deploy sounds now play only for the player that deployed it.
- Snark nest will no longer show on-screen message regarding Chumtoad use.
3 Maps
3.1 Abandoned
- New disco music.
3.2 Black Mesa: Special Tactics Sector
- Fixed the yellow team wrongly being charged 32 points instead of 30 points when purchasing level 5 upgrades.
3.3 Dead Simple Neo 2
- Added HUD display for Doom Box.
- Changed Doom Box size to make it pushable.
- Reduced friction of Doom Box to make overload mode winnable again.
3.4 Fortified
- Fixed computer hack progress bar. (Thanks Sparks.)
- New bossa nova waiting music.
3.5 Half-Life
- Chapter 1-13:
- Converted "func_wall" props to "func_detail".
- Set brush entity prop light flags to "opaque" so that they cast shadows.
- Set translucent glass to use embedded light maps so that they are lit correctly.
- Chapter 1-3: Fixed all of the mismatched lighting from the original Half-Life maps.
- Chapter 4 & 10: Fixed scientists with Luther body group being spawned with incorrect hand skin.
- Chapter 5 area 2: Fixed fuel/oxygen bubbles not getting turned on.
- Chapter 7: Fixed texture axis perpendicular to face error on train tracks.
- Chapter 7 areas 1-2: Added 75 damage to train elevator to prevent elevator clipping through the train if too many players are blocking it from moving.
- Chapter 10: Fixed horrible over-bright sky lighting that did not match the original maps. Sky light now toggles to a "late day" variant once players turn off the surgical machine to match the original Half-Life lighting in the outdoor area.
- Chapter 11 area 1:
- Fixed lights in the tunnel connection to "Surface Tension" that were the wrong colour.
- Fence outside of Questionable Ethics exit is now illusionary so that bullets pass through it.
- Chapter 12: Fixed leech getting stuck in the giant cog and preventing players from finishing the map.
- Chapter 13 area 2:
- Fixed missing orange glowing light emanating from the reactor core at map start.
- Fixed reactor flood valves not playing a 'locked' sound when the pumps are not activated.
- Fixed reactor flood valves not rotating when the buttons are unlocked after pumps are turned on.
- Fixed reactor not flooding all the way, preventing players from proceeding to the next map.
- Fixed reactor status lights not turning green inside of the reactor core when the pumps are activated.
- Chapter 13 area 2 & 3: Fixed missing texture light "+0~TNNL_LGT4" which was accidentally not included in the RAD files for previous compiles. This fixes all missing orange lights in reactor core area.
- Chapter 17:
- Fixed the horrendously bright lighting in Nihilanth's chamber and better matches the original Half-Life lighting.
- Made several ledges and static props opaque to light to stop light bleeding through solids.
3.6 Osprey
- Moved a crossbow bolt item up one unit to stop it falling through a shelf.
3.7 Polar Rescue
- Added a false ceiling to the canteen with better lighting.
- Added a hurt brushes around the lit hob and boiling pot in the kitchen.
- Added a small waste area opposite the incinerator room for cover in battle.
- Added blast helper sprite above the conditionally fragile glass for the security room to make obvious that explosives are needed.
- Added exit ladders to both sides of the collapsible bridge.
- Added HUD text to the box blocking view of the commander shield button to draw a bit more attention towards that position.
- Added HUD text to the not-quite-in-place floor panel cover in the commander podium to draw a bit more attention towards it.
- Added NPC clipping around the base of the reactor core to avoid the NPCs being so enclosed.
- Added railings to the steps in the reactor chamber.
- Added side corridor to the elevator pit so if a hostage falls down there you can guide them out of it to the stairwell. (Looks like a steep monster clip on the ladder no longer works.)
- Added visual timer to the HUD for the primary objective. (Same style as They Hunger: Escape.)
- Changed blue level to have a bluer stone floor.
- Changed green level to have a green stone floor.
- Changed landing pad corridor to have a white stone floor.
- Fixed a blunder with one of the inner vault doors having a visible null face.
- Fixed some M16s being orientated the wrong way at the command centre.
- Hard and extreme difficulties will not have any helper sprites at all!
- Improved initial direction of sentry turrets so that the gun rotates out towards the direction they're most likely to be firing towards.
- Landing pad tunnel lights will now start off.
- Many detail and lighting tweaks. (Better glow sprites, added glow sprites to most flat lights.)
- More detail work in the kitchen.
- Reduced scale of tile based floors to more closely resemble a realistic size.
- Reduced the audible distance of many ambient sounds to reduce too much cross-room disturbance.
- Removed "maps/checklist.txt" from the resources file.
- Removed a lip at the floor of the secure storage doors, making navigation for the hostages out of their rooms easier.
- The chasm bridge sections are now staggered slightly when opened together to prevent them moving into each other.
- The vault buffer space is now very metallic for more of a sealed feeling.
- Updated material definitions.
3.8 Sandstone
- Engineer guards have new names.
- Fixed missing model replacement paths for grunts.
- Lighting tweaks.
- Moved the map cross sprites 0.9 units closer to the paper so they don't have a floaty gap.
3.9 Suspension
- Fixed sentry turrets not auto-starting.
- Fixed day/night vote issue.
- Fixed weird texture issue on medkits.
3.10 The Mustard Factory
- New map! BSP name
mustard
.
3.11 They Hunger: Escape
- Added a new dumpster with an open-able lid by the ambulance crash site, so that you can hide like a piece of trash instead of helping to beat the map.
- Fixed zombie cops using normal not-zombie skin.
- Made it easier to get out of the water in the sewer river transport area.
3.12 Toonrun
3.12.1 All
- Changed clip type from precise to simple for smoother movement on slopes.
3.12.2 Part 1
- Added blocker brush to the duck's mouth to prevent rushers from dashing ahead before the sign falls. (Anti-rush.)
- Added clip brushes in the outdoor areas.
- Added crush damage to the falling sign just before the duck.
- Aligned checkpoints with geometry.
- Fixed stage door not going up if some of the theatre monsters were blocked from spawning, making the counter impossible to reach.
- Fixed yellow door at the start only opening once, then closing shortly, when the bomb goes off.
- Raised the water at the no fishing pond so it's not (near) impossible to get out alone.
3.12.3 Part 2
- All flower breakage triggers are now explosives only. (Should fix highly charged gauss exploit.)
- Fixed middle flower being a blocker:
- The blowtatoe thrown in still has to be quite accurate to travel far down enough the flower's stem.
- This should be quite banana bomb resistant too, not banana bomb proof though.
- Fixed middle flower monsters spawning too high and facing the wrong way.
- Fixed survival mode never starting.
- Reduced blowtatoe respawn time to 10 seconds.
3.12.4 Part 3
- Added checkpoint after defeating Dr Freakingstein.
- Added wall blocker until Dr Freakingstein is defeated. (Anti-rush.)
- Corrected a leak on the floor and ceiling of the diagonal sloped corridors to those shield power generators underneath the final final boss.
- Disabled A.I. for the Mother Spleen to prevent it being moved by explosions.
3.13 They Hunger: Escape
- Changed script entity name "func_vehiclecontrols" to "func_vehiclecontrols_custom" to prevent conflict with game code entity and to fix the tutorial car not being drivable after repairing.
3.14 Turret Fortress (original)
- Fixed computer virus disinfection progress bar. (Thanks Sparks.)
- Fixed low gravity still being applied when exiting spawn rooms.
- Increased health and lowered friction of pushable turret boxes.
- Reduced biohazard sound.
- Removed decimals from counters.
4 Models
4.1 Weapons/Items
- Classic shotgun: Fixed the viewport model showing a floating shell close to the camera.
- Haloween event: Added pumpkin model replacements for ammo types (3 sizes). Plays one of the 3 spooky sound effects when picked up.
4.2 NPCs
- Floater: Marked idle animation as "ACT_IDLE" and loop so that it's actually used in-game.
- HWGrunt:
- Add ammo pack hit-box.
- Add footstep events to "pistol_walk", "creeping_walk", and "run".
- Adjust dimensions of stomach and chest hit-boxes to more accurately reflect torso polygons.
- Assign correct hit-box groups to each body type.
- Increase head hit-box height to fully contain head polygons.
- Remove oversized "Bip01 L Arm" and "Bip01 R Arm". (Arm1, Arm2, Hand is sufficient.)
4.3 Other
- Extra skins for the male assassin player model. (black, camo, grey, and night vision)
5 Sounds
5.1 Weapons/Items
- Halloween event: Added spooky sound effects for pumpkin model replacements.
5.2 NPCs
- Human grunt: Added new human grunt sentence group "HG_FLOF". (Used when a friendly is in the NPC's line of fire. Primarily used by the HWGrunt when obstructed by an ally.)
6 Scripts
6.1 Map entities
- Added "trigger_observer" script:
- This registers an entity "trigger_observer" to allow a map to start/stop a player's observer mode arbitrarily.
- Point entity mode can apply to players by their target name, including "!activator" and "!caller" specials.
- Point entity mode includes optional memory of the player's position so they can be moved back there when leaving observation.
- Pretty much an expanded rip-off of Trempler's script from BM:STS, though this also permits the entity to be point based, and handles use types on/off/toggle accordingly.
- Checkpoint: (Thanks Outerbeast.)
- Add `Use()` function so the checkpoint can be triggered remotely without a touch.
- Added HUD notification when a checkpoint is used, and by whom.
- Added flag to disable "game_player_equip" entities being triggered when checkpoint is used.
- Added flag to make a checkpoint start inactive, requiring direct trigger to activate it so it can be used.
- Added option to change the music that plays when the checkpoint is used via a key that accepts a custom sound.
- Fix "game_player_equip" being called with `Touch()`, this should be `Use()`.
- Modified entity register so "map_script point_checkpoint" can be put into a map configuration, without mapper intervention to register the entity after the fact. (See code in included script file for how this is done.)
- Prevent players from using the checkpoint if there are no dead players, this is to stop checkpoints being wastefully used when there aren't any dead players to revive. (Touching has no effect while all players are alive.)
- Respawning players will now fire the checkpoint's "target" if specified.
- Hide & Seek:
- Added function `ShowGameRules()` to show a brief message about the game rules. (Can be called by the map with a "trigger_script".)
- Seeker health at 1000 instead of 999. (That old issue with the client crashing when health/armor exceeds 999 no longer exists.)
- Teslagun weapon: Switched damage type for the secondary fire from DMG_GIB_CORPSE to DMG_SHOCK and DMG_ENERGYBEAM to prevent NPCs from flying away when hit.
6.2 Server plug-ins
- Entity manager: Included warning notice for server operators, as too many seem to blindly activate this plug-in in public games without realising how badly it can (and will) be abused.
- Teleport: Do not allow position saving whilst observing.
7 SDK
7.1 Svencraft
This update should make Svencraft noticeably more usable with stability comparable to Valve Hammer 3.5.
- Abort loading textures of which have become corrupted in heap memory.
- Added more virtual height to most of the drop down menus so when you expand them they show more. (Particularly the drop downs that only showed one row.)
- Alpha bleeding: Apply 50% translucency to textures on normal rendered solids in the following conditions:
- World brushes: Those typically stripped out by the map compilers. (BEVEL, BOUNDINGBOX, CLIP, CLIPBEVEL, CLIPBEVELBRUSH, CLIPHULL1, CLIPHULL2, CLIPHULL3, CONTENTEMPTY, CONTENTWATER, HINT, NOCLIP, NULL, SKIP, SKY, and SOLIDHINT)
- Brush entities: Those that are typically invisible when part of a brush entity. (AAATRIGGER and ORIGIN)
- Block array template: Count and blocks variables changed to be integer type to match other references, or they just overflowed into inaccessible memory.
- Fixed a crash in the entity report caused when filtering by key/value without specifying a key. (Because you want to search all keys for a value.)
- Fixed entity keys being limited to 31 characters and values being limited to 80 characters. (Bumped up to 255 and 4095 respectively to match the engine limits.)
- Fixed point entity origin not honouring the floating precision option when exporting to MAP. (Entity origins will no longer snap to whole numbers when the mapper doesn't want this to happen.)
- Fixed quite a lot of random crashing and unhandled exceptions.
- Fixed tabbed settings sometimes getting messed up after being "used" (e.g. seen in a form) more than once.
- Permit decal to span up to 64 faces instead of 32.
- Sprite renderer:
- Do not attempt to render a null frame. (That would otherwise cause a crash if a mapper accidentally sets a sprite based entity to a model file.)
- View port type will now be used, allowing you to visualise your sprites in non-parallel modes in the 3D view. (This should help get your fixed orientation right.)
- Worked around an infinite loop whereby an "elapsed time this frame" variable would never decrement if a sprite's frame rate was stupidly low (e.g. 0.001 or 1000 seconds per frame).
- Object editor window:
- Enlarged dialog from 384x240 to 480x320.
- Enlarged new key/value sub-dialog so that the text boxes can match the enlarged parent dialog.
- Performance enhancement: Don't bother preparing the dialog when there is no window present. (MAY speed up loading maps and handling large selections.)
- When smart edit is disabled:
- Fixed key/value pairs becoming copied instead of renamed when editing a key.
- The entity value text box will now wrap its content.
- When ENTER is pressed in the value text box instead of CRLF appearing (new line) a literal "\n" will appear.
- Textures block array: Increased to 16,384 words from 8,192. (This should allow for up to 64 MiB of WAD textures to be loaded into memory.)
- Texture window: The option to stretch textures will now maintain aspect ratio so all textures are still readable whilst using as much space as they can.
7.2 FGD
- Added entity "monster_cleansuit_scientist_dead".
- Added entity "monster_gonome_dead".
- Added entity "monster_human_medic_ally_dead".
- Added FGD for script entity "trigger_observer".
- Added missing and corrected some existing properties to environment sprites.
- Added missing flags to "func_monsterclip".
- Added property "bodygroup" key to "trigger_changemodel".
- Added property "new_skin" to "squadmaker".
- Added property "pushmode" to "trigger_push".
- Added property "triggervalue" to "trigger_relay".
- Added properties to "global_light_control":
- Add "target_entity" key.
- Add comments describing how the entity works.
- Change order of "targetname" and "target".
- Added properties to "item_airtank":
- Spawn flag 1: Do not explode
- Spawn flag 2: Start empty
- Spawn flag 128: TOUCH Only
- Spawn flag 256: USE Only
- Spawn flag 512: Can Use w/o LoS
- Strength
- Extra Air Time Given (0 = default)
- Refill Time (0 = default, -1 = never)
- Target: On consume
- Target: On is empty
- Target: On refill
- Target: On destroy
- Sound: On consume
- Sound: On is empty
- Sound: On refill
- Added properties to "player_weaponstrip":
- Spawn flag 2: Also strip long jump
- Weapons list to strip (none = all)
- Weapons list mode
- Added properties to "point_checkpoint":
- Spawn flag 1: Reusable
- Delay before start
- Delay between each revival
- Delay before reset
- Show spawn effect
- Added properties to "trigger_script":
- Spawn flag 2: Self '!activator' (trigger mode)
- Spawn flag 4: Self '!caller' (trigger mode)
- Spawn flag 64: Keep '!activator' (think mode)
- Added radius figures to small/medium/large spawn flags for "env_message", "func_rotating", and "scripted_sentence".
- Added spawn flag 1 to "trigger_effect": Start on.
- All "triggerstate" (and alike) properties will be 2 (toggle) by default instead of 0 (off). (Changed for player spawns, "trigger_auto", "trigger_entity_iterator", and "trigger_relay".)
- Corrected item entities (apart from the airtank) wrongly inheriting "Targetx" instead of "Target".
- Corrected "squadmaker" key "notsolid", changed to "new_solid".
- Entity "item_inventory" needed to inherit "CustomRespawnDelay" to present a key for a custom materialisation (respawn) delay.
- Made ultra mega super sure that "survival.fgd" is included.
- Marked the "Force push" flag as deprecated in "trigger_push". (Use "pushmode" property instead.)
- Removed incomplete entities: "item_healthcharger", "item_recharge", "monster_flyer_flock"
- Removed kill target from "trigger_changetarget".
- Removed landmark name, change target, and delay before change target from "trigger_changelevel".
- Removed obsolete entities: "game_player_team", "game_team_master", "game_team_set", "info_intermission", "info_monster_goal", "trigger_autosave", "trigger_endsection", "trigger_transition", "world_items"
- Updated spawn flag labels for "player_weaponstrip":
- Shortened "Also strip suit" to "Strip Suit".
- Shortened "Also strip long jump" to "Strip Long Jump".
- Updated "trigger_setcvar" with the correct list of map CVARs it can manipulate.
- Updated "trigger_relay" with use types SET and KILL.
- Use correct model for "weapon_medkit". ("w_pmedkit.mdl", not "w_medkit.mdl".)
7.3 Map compile tools
- All: Added option to all tools "-nomapsettings" to bypass compile settings from any "info_compile_parameters" entities.
- RAD:
- Fixed bounce lighting not always being calculated correctly.
- Fixed sunlight angles not always being honoured.
- Removed the operation that subtracted the base light (the world light, or light style 0) from other light styles in the "FinalLightFace" function. This operation was reducing the intensity of other light styles by the amount of the base light. By removing this, each light style now contributes its full intensity, leading to more accurate brightness levels. (This change aligns with the original functionality of prior versions of ZHLT.)
7.4 item_inventory test map
- Booth 15:
- Iron boots item to test avoiding the pushing force of a "trigger_push" whilst wearing them.
- You can swap "item_name_required" for "item_name_canthave" to reverse the effect, e.g. you must have the item mentioned to be pushed and won't be pushed without the item.
- Booth 16:
- Presents demonstrating self-activated items via the inventory UI.
- The 3 gifts can only be activated "unwrapped" once.
8 Other
8.1 Delta
- Fix issue with "Entity_Encode" origin precision not matching "Player_Encode" origin precision.
- Increased "body" value from 8 to 15 so more than 256 body groups can be assigned.
8.2 Misc
- Advanced settings screen:
- Add 4 options to reduce violence.
- Added borderless window setting.
- Added HUD chat settings, including the new option to block messages from voice muted players.
- Christmas event now runs from 24/Dec to 26/Dec (3 days total) down from 24/Dec to 05/Jan (12 days total).
- Default map settings configuration: Corrected CVAR "mp_forcespawn", should be "mp_forcerespawn".
- Default plug-ins configuration:
- Included admin level restriction in the example for the entity manager plug-in to promote awareness on how it should be safely activated.
- Linux game client launcher:
- Enabled Steam Overlay by default with switch "-nosteamoverlay" to disable it.
- Make shellcheck.net happy.
- Removed unnecessary library "libiconv.so.2" from LD_PRELOAD.
- Removed URL pointing to the dead forums. (It's dead, Jim.)
- Updated year in header.
- Workaround to get rid of SetLocale pop-up when launched outside Steam client or without Steam Runtime enabled.
- Do not force Steam Runtime library paths when running game outside Steam client. (E.g. from a terminal.)
- Linux SvenDS launcher script:
- Create "steam_appid.txt" file at root directory (where main binaries are) with the game's application ID (225840) if doesn't exist.
- Disabled CPU auto detect feature used to pick between i686 and AMD binaries. (AMD binaries are causing issues with config parsing for a couple of server operators, even with dedicated AMD hardware.)
- Workaround for "Unable to initialize Steam" error on first clean game server start-up.
- Server settings screen:
- Removed "skill" CVAR.
- Shared "server.cfg" example:
- Do not set "skillcfgfile" CVAR to non-existent "servers/skill.cfg" non-existent file as it's a bit misleading, and causes noticeable game play faults.