1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- /**
- * [CSRD] Extended Humiliation Round Fixes
- *
- * Minor quality-of-life improvements in extended humiliation rounds.
- *
- * 1. Hides the round win panel 5 seconds after the round is over. Pairs well with an
- * end-round Prop Hunt system as it prevents the win panel from covering up a good amount of the
- * screen for the rest of the humiliation period.
- * 2. Hides losing player health. "The losers are all too concerned with trying to escape the
- * victors that they don't notice how much health they have left" is what I'd like to think.
- */
- #pragma semicolon 1
- #include <sourcemod>
- #include <tf2_stocks>
- #pragma newdecls required
- #define PLUGIN_VERSION "1.0.0"
- public Plugin myinfo = {
- name = "[CSRD] Extended Humiliation Round Fixes",
- author = "nosoop",
- description = "Improvements to deal with extended humiliation rounds.",
- version = PLUGIN_VERSION,
- url = "https://git.csrd.science/"
- }
- #define HIDEHUD_HEALTH ( 1 << 3 )
- public void OnPluginStart() {
- HookEvent("teamplay_round_win", OnRoundWin, EventHookMode_PostNoCopy);
- }
- public void OnRoundWin(Event event, const char[] name, bool dontBroadcast) {
- // we could pass it so only winners have their win panel closed...
- if ((FindConVar("mp_bonusroundtime").IntValue > 5)) {
- CreateTimer(5.0, HideWinPanelAll);
- }
- }
- public Action HideWinPanelAll(Handle timer, any discard) {
- int clients[MAXPLAYERS], numClients;
-
- for (int i = 1; i <= MaxClients; i++) {
- if (!IsClientInGame(i) || IsFakeClient(i)) {
- continue;
- }
-
- TFTeam team = TF2_GetClientTeam(i);
-
- if (team == TFTeam_Red || team == TFTeam_Blue) {
- clients[numClients++] = i;
-
- // just set and forget; no need to reset this at round start
- SetEntProp(i, Prop_Data, "m_iHideHUD", HIDEHUD_HEALTH);
- }
- }
-
- TF2_HideWinPanel(clients, numClients);
- }
- /**
- * Based off of CTFWinPanel:FireGameEvent():
- * https://github.com/LestaD/SourceEngine2007/blob/master/se2007/game/client/tf/tf_hud_winpanel.cpp#L103
- *
- * When a client receives the `teamplay_round_start` event, it hides the win panel.
- * `teamplay_game_over` and `tf_game_over` may also possibly work, though I didn't bother
- * checking since it's likely they do other stuff on the client (like showing other panels or
- * something).
- */
- stock void TF2_HideWinPanel(const int[] clients, int numClients) {
- if (numClients) {
- Event event = CreateEvent("teamplay_round_start", true);
-
- #if SOURCEMOD_V_MAJOR >= 1 && SOURCEMOD_V_MINOR > 8
- // avoid broadcasting event
- event.BroadcastDisabled = true;
- #endif
-
- for (int i = 0; i < numClients; i++) {
- event.FireToClient(clients[i]);
- }
-
- delete event;
- }
- }
|