Skip to content

Release 3.1.0 R - #155

Merged
R1KO merged 59 commits into
masterfrom
dev
Oct 10, 2026
Merged

R1KO merged 59 commits into
masterfrom
dev

Conversation

@R1KO

@R1KO R1KO commented Oct 10, 2026 •

Copy link
Copy Markdown
Owner

Release 3.1.0 R.

New (ported from 3.1-dev)

  • Per-player storage: vip_storage table, sm_vip_storage_id, VIP_SetClientStorageValue / VIP_GetClientStorageValue, VIP_OnClientStorageLoaded
  • Feature statuses are stored in vip_storage instead of clientprefs cookies (USE_CLIENTPREFS 0); existing cookie values are migrated on first load
  • VIP_AddGroup / VIP_RemoveGroup (in-memory groups), VIP_IsGroupExists (VIP_IsValidVIPGroup is deprecated), VIP_OnConfigsLoaded, VIP_CORE_INTERFACE 310
  • Features are turned off when VIP is removed by a plugin or an admin
  • vip_modules.phrases.txt added (the core already loaded it)

Fixes

  • Server hang when sm_vip_menu_commands is empty or ends with ;
  • SQL injection in the admin menu player search
  • Every in-game player loaded twice on start / late load (leaks, double forwards and toggles)
  • Expired VIPs deleted in-game with sm_vip_delete_expired -1
  • Admin menu acting on a stale target after picking from the DB list; deleting an online player left in-game VIP active
  • VIP_OnVIPClientLoaded and feature toggles firing twice while the status store was loading
  • Text with % (player names) breaking chat messages, VIP_LogMessage and logs
  • Removals not logged / DataPack leaks when the admin leaves mid-query
  • iAdmin -1 ("plugin") throwing in VIP_GiveClientVIP / VIP_RemoveClientVIP2
  • Wrong old group in the group change log, wrong SteamID in the temp VIP info menu, admin menu "back" after adding a VIP
  • VIPs not yet authorized by Steam on connect never getting VIP that session
  • VIP_OnClientLoaded not firing for an invalid group or a DB error; client reset wiping spawn/chat flags
  • Storage changes lost on plugin unload/reload (saved synchronously in OnPluginEnd)
  • VIP_RegisterFeature breaking modules built against an older include
  • sm_addvip int overflow on large durations; malformed STEAM_ ids accepted
  • VIP_GetClientFeatureBool ignoring the value, cookie leak on VIP_UnregisterFeature, VIP_GetDatabase throwing before connect
  • Info messages: KeyValues leak when blocked, Plugin_Changed ignored, https:// URLs broken
  • VIP menu flood guard never triggering

Other

  • Code, comments, cvar descriptions and docs are English-only; guides moved to docs/
  • Code style and comment rules in AGENTS.md
  • updates.md removed: the changelog lives in GitHub Releases (3.0 DEV history moved into the 3.0 R notes)

Builds clean on SM 1.10–1.13.

🤖 Generated with Claude Code

R1KO and others added 30 commits October 10, 2026 17:13
…ut the file was missing. Fix duplicate Pets_* phrases and mislabeled language keys in BHOP_TIME, Defuser and EquipmentsMenu.
…min, as in 3.1-dev. Features_TurnOffAll now skips non-VIP clients instead of touching a null status map.
…dVIPGroup is now deprecated) and VIP_CORE_INTERFACE 310, as in 3.1-dev. Forwards are now created before configs are read so the new forward can fire on plugin start.
…, as in 3.1-dev. Groups are reset on config reload, so modules should re-add them in VIP_OnConfigsLoaded.
…e_id, VIP_Set/GetClientStorageValue natives and VIP_OnClientStorageLoaded forward. Unlike 3.1-dev, storage waits for the database and a valid Steam account, writes only when changed, and uses portable single-quoted SQL.
…fs cookies (USE_CLIENTPREFS 0, as in 3.1-dev), migrating existing cookie values on first load. The status-store wait timer now reloads features once when ready instead of on every tick, and gives up after 60s.
… or ends with ';'. The loop now stops on the last part even if it is empty after trimming.
…ing another one from the DB list. Picking from the DB list now clears the stale target userid, and deletion looks the target up online by account id either way.
…ed is -1 (never delete). The check now matches the one used on connect.
…hich leaked feature maps and fired load forwards and feature toggles twice. OnReadyToStart now only loads storage and leaves the VIP check to UTIL_ReloadVIPPlayers; Clients_CreateClientVIPSettings frees old maps in case of overlapping reloads.
… now escaped via Database.Format. Names containing a quote no longer break the query either.
…e style. Formatting only, no behavior change.
…taining '%' (e.g. player names): already formatted text is now passed through "%s" instead of being used as a format string.
…in leaves before the query finishes. Also free the DataPack when the row to remove is already gone.
…dmin -1, which the include documents as "plugin". Any negative iAdmin is now treated as REASON_PLUGIN.
…ld group is now read before it is overwritten.
… to the menu they came from instead of the SourceMod top menu (an error if adminmenu is not loaded). Also fix the missing phrase shown when the target left.
Fix critical bugs from code review
…tatus store (cookies / storage) was not ready yet. Features are now loaded once, after the store is ready or the 60s wait runs out.
R1KO and others added 29 commits October 10, 2026 20:28
Brace single-statement bodies
Fix serious bugs from code review
…nClientLoaded never firing for an invalid group or a database error. A status-store wait timer left over from a previous load no longer loads features a second time.
…g VIP for that session. They are loaded as non-VIP without querying account 0, then checked again from OnClientAuthorized (moved to Clients.sp, it also retries storage).
…atures off, which left module effects active. All in-game VIP removals now go through Clients_RemoveVIPStatus (features off, then reset); disconnect still only resets.
…unloaded or reloaded. OnPluginEnd now saves every changed client synchronously, since async queries may never run at that point.
…nclude with fewer params, which left the feature half-registered. The optional default status and cookie flag are now read only when passed, before anything is registered.
…ys) or an unknown time mode, which wrote garbage expiry dates. UTIL_TimeToSeconds now returns -1 on overflow, and sm_addvip validates the converted duration and the resulting expiry.
…the value "0" via VIP_GiveClientFeature. It now returns the stored value, not whether the key exists.
…, because the last-use time was never stored. It now uses engine time, which unlike game time does not restart on map change.
…age (Plugin_Stop/Plugin_Handled) in VIP_OnShowClientInfo. With Plugin_Changed the module's edited copy is now actually shown instead of the config.
…TD panel. A scheme is now only added when the URL has none.
…ID_PENDING, truncated input) into garbage account ids used by sm_addvip, sm_delvip and the admin search. The STEAM_X:Y:Z format is now validated, otherwise 0 is returned.
…d to the database. It now returns null in that case, as documented in the include.
…e loaded before Steam authorized them, so an already loaded player is never loaded twice.
…st practices for code comments: explain why, not what, and comment only what a reader would trip over.
Fix medium/minor bugs from code review
…with a new SHOW_MORE phrase (en/ru/ua). Also translate the remaining Russian comments in List.sp.
…, vip_core.inc docs and the changelog to English. Other languages now live only in translation files and per-language config values; AGENTS.md states the rule.
…te them to English and link them from the README.
English-only code and docs; guides moved to docs/
… notes, and the changelog is kept in GitHub Releases.
@R1KO
R1KO merged commit e0c3227 into master Oct 10, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant