From 4c1a36e1eb2aa682143cd35db895fa26e81e2fd8 Mon Sep 17 00:00:00 2001 From: Dolly132 <109222243+Dolly132@users.noreply.github.com> Date: Mon, 8 Dec 2025 11:41:11 +0200 Subject: [PATCH 1/3] fix(vipmode): improve vip death detection --- addons/sourcemod/scripting/FunModes.sp | 7 +-- .../sourcemod/scripting/Fun_Modes/VIPMode.sp | 62 ++++++++----------- 2 files changed, 28 insertions(+), 41 deletions(-) diff --git a/addons/sourcemod/scripting/FunModes.sp b/addons/sourcemod/scripting/FunModes.sp index 44e6838..34db9ed 100644 --- a/addons/sourcemod/scripting/FunModes.sp +++ b/addons/sourcemod/scripting/FunModes.sp @@ -225,7 +225,7 @@ public Plugin myinfo = name = "FunModes", author = "Dolly", description = "bunch of fun modes for ze mode", - version = "1.4.10", + version = "1.4.11", url = "https://nide.gg" } @@ -358,7 +358,7 @@ public void OnClientPutInServer(int client) void OnTakeDamagePost(int victim, int attacker, int inflictor, float damage, int damagetype) { if (g_bIsVIPModeOn) - VIPMode_OnTakeDamagePost(victim, attacker); + VIPMode_OnTakeDamagePost(victim, attacker, damage); if (g_bIsDamageGameOn) DamageGame_OnTakeDamagePost(victim, attacker, damage); @@ -901,9 +901,6 @@ stock void SendHudText(int client, const char[] sMessage, bool isFar = false, in public void ZR_OnClientInfected(int client, int attacker, bool motherInfect) { - if (g_bIsVIPModeOn) - VIPMode_OnClientInfected(client); - if (g_bIsRLGLEnabled && g_bEnableDetecting) RLGL_OnClientInfected(client); diff --git a/addons/sourcemod/scripting/Fun_Modes/VIPMode.sp b/addons/sourcemod/scripting/Fun_Modes/VIPMode.sp index 3be761f..1caafbd 100644 --- a/addons/sourcemod/scripting/Fun_Modes/VIPMode.sp +++ b/addons/sourcemod/scripting/Fun_Modes/VIPMode.sp @@ -1,6 +1,8 @@ #pragma semicolon 1 #pragma newdecls required +bool g_bDiedFromLaser[MAXPLAYERS + 1]; + ConVarInfo g_cvInfoVIP[4] = { {null, "15.0,25.0,40.0,60.0", "float"}, @@ -37,67 +39,49 @@ void VIPMode_SetCvarsInfo() g_cvInfoVIP[i].cvar = cvars[i]; } -stock void VIPMode_OnTakeDamagePost(int victim, int attacker) +stock void VIPMode_OnTakeDamagePost(int victim, int attacker, float damage) { - if(!g_cvVIPModeLaser.BoolValue) + if (!g_cvVIPModeLaser.BoolValue) return; - if(!g_bIsVIP[victim]) + if (!g_bIsVIP[victim]) return; - if(!IsValidEntity(attacker)) + if (!IsValidEntity(attacker)) return; char classname[64]; - if(!GetEntityClassname(attacker, classname, sizeof(classname))) + if (!GetEntityClassname(attacker, classname, sizeof(classname))) return; /* if attacker entity is not trigger_hurt */ - if(!StrEqual(classname, "trigger_hurt")) - { - RemoveClientVIP(victim, true, "VIPMode_VIPDeath"); + if (strcmp(classname, "trigger_hurt") != 0) return; - } /* we should now check if trigger_hurt is from a laser */ int parent = GetEntPropEnt(attacker, Prop_Data, "m_hParent"); - if(!IsValidEntity(parent)) + if (!IsValidEntity(parent)) return; bool isFromLaser = false; char parentClassName[64]; - if(!GetEntityClassname(parent, parentClassName, sizeof(parentClassName))) { + if(!GetEntityClassname(parent, parentClassName, sizeof(parentClassName))) return; - } - if(StrEqual(parentClassName, "func_movelinear") || StrEqual(parentClassName, "func_door")) + if (strcmp(parentClassName, "func_movelinear") == 0 || strcmp(parentClassName, "func_door") == 0) isFromLaser = true; - - if(!isFromLaser) - { - RemoveClientVIP(victim, true, "VIPMode_VIPDeathLaser"); - return; - } - - CPrintToChatAll("%s %T", VIPMode_Tag, "VIPMode_VIPDeathLaser", victim, victim); - RemoveClientVIP(victim, false); - return; -} - -stock void VIPMode_OnClientInfected(int client) -{ - if(!g_cvVIPModeLaser.BoolValue) - return; - if(!g_bIsVIP[client]) + if (!isFromLaser) return; - - RemoveClientVIP(client, true, "VIPMode_VIPDeath"); + + g_bDiedFromLaser[victim] = false; + if (damage > GetClientHealth(victim)) + g_bDiedFromLaser[victim] = true; } stock void PlayerDeath_VIPMode(int userid) { - if(!g_bIsVIPModeOn || g_cvVIPModeLaser.BoolValue) + if(!g_bIsVIPModeOn) return; int client = GetClientOfUserId(userid); @@ -107,6 +91,14 @@ stock void PlayerDeath_VIPMode(int userid) if(!g_bIsVIP[client]) return; + if (g_bDiedFromLaser[client]) + { + CPrintToChatAll("%s %T", VIPMode_Tag, "VIPMode_VIPDeathLaser", client, client); + RemoveClientVIP(client, false); + g_bDiedFromLaser[client] = false; + return; + } + RemoveClientVIP(client, true, "VIPMode_VIPDeath"); } @@ -176,10 +168,8 @@ stock void RoundStart_VIPMode() /* DELETE VIP BEACON TIMER */ for(int i = 1; i <= MaxClients; i++) { - if(!IsValidClient(i)) - continue; - g_bIsVIP[i] = false; + g_bDiedFromLaser[i] = false; delete g_hVIPBeaconTimer[i]; } From 97b96fb384971522205e317b9c5dde4ea1b6bb9a Mon Sep 17 00:00:00 2001 From: Dolly132 <109222243+Dolly132@users.noreply.github.com> Date: Wed, 24 Dec 2025 18:18:25 -0800 Subject: [PATCH 2/3] fix laser death detection --- addons/sourcemod/scripting/FunModes.sp | 21 +++++++++---- .../sourcemod/scripting/Fun_Modes/VIPMode.sp | 30 ++++++++++--------- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/addons/sourcemod/scripting/FunModes.sp b/addons/sourcemod/scripting/FunModes.sp index 34db9ed..19d9f8c 100644 --- a/addons/sourcemod/scripting/FunModes.sp +++ b/addons/sourcemod/scripting/FunModes.sp @@ -352,17 +352,26 @@ public void OnClientPutInServer(int client) if (IsFakeClient(client)) return; - SDKHook(client, SDKHook_OnTakeDamagePost, OnTakeDamagePost); + if (g_bIsVIPModeOn) + SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage); + else + SDKHook(client, SDKHook_OnTakeDamagePost, OnTakeDamagePost); } -void OnTakeDamagePost(int victim, int attacker, int inflictor, float damage, int damagetype) -{ - if (g_bIsVIPModeOn) - VIPMode_OnTakeDamagePost(victim, attacker, damage); - +void OnTakeDamage(int victim, int attacker, int inflictor, float damage, int damagetype) +{ if (g_bIsDamageGameOn) DamageGame_OnTakeDamagePost(victim, attacker, damage); } + +public Action OnTakeDamage(int victim, int& attacker, int& inflictor, float& damage, int& damagetype) +{ + if (!g_bIsVIPModeOn) + return Plugin_Continue; + + return VIPMode_OnTakeDamage(victim, attacker, damage); +} + /* *** EVENTS HOOKS CALLBACKS *** */ diff --git a/addons/sourcemod/scripting/Fun_Modes/VIPMode.sp b/addons/sourcemod/scripting/Fun_Modes/VIPMode.sp index 1caafbd..509a90c 100644 --- a/addons/sourcemod/scripting/Fun_Modes/VIPMode.sp +++ b/addons/sourcemod/scripting/Fun_Modes/VIPMode.sp @@ -39,44 +39,46 @@ void VIPMode_SetCvarsInfo() g_cvInfoVIP[i].cvar = cvars[i]; } -stock void VIPMode_OnTakeDamagePost(int victim, int attacker, float damage) +stock Action VIPMode_OnTakeDamage(int victim, int attacker, float damage) { if (!g_cvVIPModeLaser.BoolValue) - return; + return Plugin_Continue; if (!g_bIsVIP[victim]) - return; + return Plugin_Continue; if (!IsValidEntity(attacker)) - return; + return Plugin_Continue; char classname[64]; if (!GetEntityClassname(attacker, classname, sizeof(classname))) - return; + return Plugin_Continue; /* if attacker entity is not trigger_hurt */ if (strcmp(classname, "trigger_hurt") != 0) - return; + return Plugin_Continue; /* we should now check if trigger_hurt is from a laser */ - int parent = GetEntPropEnt(attacker, Prop_Data, "m_hParent"); + int parent = GetEntPropEnt(attacker, Prop_Data, "m_hParent"); if (!IsValidEntity(parent)) - return; + return Plugin_Continue; bool isFromLaser = false; char parentClassName[64]; if(!GetEntityClassname(parent, parentClassName, sizeof(parentClassName))) - return; + return Plugin_Continue; if (strcmp(parentClassName, "func_movelinear") == 0 || strcmp(parentClassName, "func_door") == 0) isFromLaser = true; - + if (!isFromLaser) - return; - + return Plugin_Continue; + g_bDiedFromLaser[victim] = false; - if (damage > GetClientHealth(victim)) + if (damage >= GetClientHealth(victim)) g_bDiedFromLaser[victim] = true; + + return Plugin_Continue; } stock void PlayerDeath_VIPMode(int userid) @@ -257,7 +259,7 @@ Action Cmd_VIPModeEnable(int client, int args) if(!IsClientInGame(i) || IsFakeClient(i) || !IsClientConnected(i)) continue; - SDKHook(i, SDKHook_OnTakeDamagePost, OnTakeDamagePost); + SDKHook(i, SDKHook_OnTakeDamage, OnTakeDamage); } return Plugin_Handled; From 9f3ad69705297c7012511557bcbef227ebcfa90c Mon Sep 17 00:00:00 2001 From: Dolly132 <109222243+Dolly132@users.noreply.github.com> Date: Wed, 24 Dec 2025 18:22:02 -0800 Subject: [PATCH 3/3] fix compiler error --- addons/sourcemod/scripting/FunModes.sp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/sourcemod/scripting/FunModes.sp b/addons/sourcemod/scripting/FunModes.sp index 19d9f8c..7b55a79 100644 --- a/addons/sourcemod/scripting/FunModes.sp +++ b/addons/sourcemod/scripting/FunModes.sp @@ -358,7 +358,7 @@ public void OnClientPutInServer(int client) SDKHook(client, SDKHook_OnTakeDamagePost, OnTakeDamagePost); } -void OnTakeDamage(int victim, int attacker, int inflictor, float damage, int damagetype) +void OnTakeDamagePost(int victim, int attacker, int inflictor, float damage, int damagetype) { if (g_bIsDamageGameOn) DamageGame_OnTakeDamagePost(victim, attacker, damage);