mirror of
https://github.com/Jackzmc/sourcemod-plugins.git
synced 2025-05-07 02:43:21 +00:00
ftt: fix detecting fake clients for specials
This commit is contained in:
parent
7d39b85191
commit
5bb96a5b3c
2 changed files with 44 additions and 17 deletions
Binary file not shown.
|
@ -35,15 +35,20 @@ public Action Timer_CheckSpecial(Handle h, int specialID) {
|
||||||
int type = GetEntProp(special, Prop_Send, "m_zombieClass");
|
int type = GetEntProp(special, Prop_Send, "m_zombieClass");
|
||||||
// Verify type of special is spawned special
|
// Verify type of special is spawned special
|
||||||
if(type == gInstaSpecialType) {
|
if(type == gInstaSpecialType) {
|
||||||
gInstaSpecialType = -1;
|
// Ignore 'ManualDirectorBot' or abm bots
|
||||||
// Set special to only attack them:
|
static char buf[32];
|
||||||
g_iAttackerTarget[special] = gInstaSpecialTarget;
|
GetClientName(special, buf, sizeof(buf));
|
||||||
// Incremenet count of specials targetting player:
|
if(StrContains(buf, "bot", false) == -1) {
|
||||||
gInstaSpecialMagnet[GetClientOfUserId(gInstaSpecialTarget)]++;
|
gInstaSpecialType = -1;
|
||||||
|
// Set special to only attack them:
|
||||||
|
g_iAttackerTarget[special] = gInstaSpecialTarget;
|
||||||
|
// Incremenet count of specials targetting player:
|
||||||
|
gInstaSpecialMagnet[GetClientOfUserId(gInstaSpecialTarget)]++;
|
||||||
|
|
||||||
TeleportEntity(special, gInstaSpecialSpawnPos, gInstaSpecialSpawnAng, NULL_VECTOR);
|
TeleportEntity(special, gInstaSpecialSpawnPos, gInstaSpecialSpawnAng, NULL_VECTOR);
|
||||||
if(gInstaSpecialInstaKill) {
|
if(gInstaSpecialInstaKill) {
|
||||||
RequestFrame(Frame_Boom, special);
|
RequestFrame(Frame_Boom, special);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -80,6 +85,7 @@ public Action Event_PlayerDeath(Event event, const char[] name, bool dontBroadca
|
||||||
int client = GetClientOfUserId(event.GetInt("userid"));
|
int client = GetClientOfUserId(event.GetInt("userid"));
|
||||||
if(client > 0) {
|
if(client > 0) {
|
||||||
if(g_iAttackerTarget[client] > 0) {
|
if(g_iAttackerTarget[client] > 0) {
|
||||||
|
// If special died, clear & subtract one from counter
|
||||||
int target = GetClientOfUserId(g_iAttackerTarget[client]);
|
int target = GetClientOfUserId(g_iAttackerTarget[client]);
|
||||||
gInstaSpecialMagnet[target]--;
|
gInstaSpecialMagnet[target]--;
|
||||||
if(gInstaSpecialMagnet[target] == 0) {
|
if(gInstaSpecialMagnet[target] == 0) {
|
||||||
|
@ -88,6 +94,7 @@ public Action Event_PlayerDeath(Event event, const char[] name, bool dontBroadca
|
||||||
}
|
}
|
||||||
g_iAttackerTarget[client] = 0;
|
g_iAttackerTarget[client] = 0;
|
||||||
} else {
|
} else {
|
||||||
|
// If player died, stop the targetting
|
||||||
for(int i = 1; i <= MaxClients; i++) {
|
for(int i = 1; i <= MaxClients; i++) {
|
||||||
if(g_iAttackerTarget[i] == client) {
|
if(g_iAttackerTarget[i] == client) {
|
||||||
g_iAttackerTarget[i] = 0;
|
g_iAttackerTarget[i] = 0;
|
||||||
|
@ -124,12 +131,12 @@ public void Event_CarAlarm(Event event, const char[] name, bool dontBroadcast) {
|
||||||
int client = GetClientOfUserId(user);
|
int client = GetClientOfUserId(user);
|
||||||
if(client) {
|
if(client) {
|
||||||
PrintToChatAll("%N has alerted the horde!", client);
|
PrintToChatAll("%N has alerted the horde!", client);
|
||||||
RequestFrame(RushPlayer, user);
|
CreateTimer(0.5, RushPlayer, user);
|
||||||
}
|
}
|
||||||
//Ignore car alarms for autopunish
|
//Ignore car alarms for autopunish
|
||||||
lastButtonUser = -1;
|
lastButtonUser = -1;
|
||||||
}
|
}
|
||||||
public void RushPlayer(int user) {
|
public Action RushPlayer(Handle h, int user) {
|
||||||
L4D2_RunScript("RushVictim(GetPlayerFromUserID(%d), %d)", user, 15000);
|
L4D2_RunScript("RushVictim(GetPlayerFromUserID(%d), %d)", user, 15000);
|
||||||
}
|
}
|
||||||
public Action L4D2_OnChooseVictim(int attacker, int &curTarget) {
|
public Action L4D2_OnChooseVictim(int attacker, int &curTarget) {
|
||||||
|
@ -159,7 +166,7 @@ public Action L4D2_OnChooseVictim(int attacker, int &curTarget) {
|
||||||
if(class == L4D2Infected_Tank && (!IsPlayerIncapped(existingTarget) || hMagnetTargetMode.IntValue & 2) && WillMagnetRun(Trolls[tankMagnetID], existingTarget)) {
|
if(class == L4D2Infected_Tank && (!IsPlayerIncapped(existingTarget) || hMagnetTargetMode.IntValue & 2) && WillMagnetRun(Trolls[tankMagnetID], existingTarget)) {
|
||||||
curTarget = existingTarget;
|
curTarget = existingTarget;
|
||||||
return Plugin_Changed;
|
return Plugin_Changed;
|
||||||
}else if(class != L4D2Infected_Tank && (!IsPlayerIncapped(existingTarget) || hMagnetTargetMode.IntValue & 1) && WillMagnetRun(Trolls[spMagnetID], existingTarget)) {
|
} else if(class != L4D2Infected_Tank && (!IsPlayerIncapped(existingTarget) || hMagnetTargetMode.IntValue & 1) && WillMagnetRun(Trolls[spMagnetID], existingTarget)) {
|
||||||
curTarget = existingTarget;
|
curTarget = existingTarget;
|
||||||
return Plugin_Changed;
|
return Plugin_Changed;
|
||||||
}
|
}
|
||||||
|
@ -181,14 +188,15 @@ public Action L4D2_OnChooseVictim(int attacker, int &curTarget) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if(IsPlayerIncapped(i)) {
|
if(IsPlayerIncapped(i)) {
|
||||||
if((class == L4D2Infected_Tank && hMagnetTargetMode.IntValue & 2 == 0) || (class != L4D2Infected_Tank && hMagnetTargetMode.IntValue & 1 == 0)) continue;
|
if(class == L4D2Infected_Tank && hMagnetTargetMode.IntValue & 2 == 0) continue;
|
||||||
|
if(class != L4D2Infected_Tank && hMagnetTargetMode.IntValue & 1 == 0) continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
PrintToConsoleAll("[FTT/Debug] Adding possible magnet victim %N for %N", i, attacker);
|
PrintToConsoleAll("[FTT/Debug] Adding possible magnet victim %N for %N", i, attacker);
|
||||||
|
|
||||||
GetClientAbsOrigin(i, survPos);
|
GetClientAbsOrigin(i, survPos);
|
||||||
float dist = GetVectorDistance(survPos, spPos, true);
|
float dist = GetVectorDistance(survPos, spPos, true);
|
||||||
if(closestClient == -1 || dist < closestDistance) {
|
if(dist < closestDistance || closestClient == -1) {
|
||||||
closestDistance = dist;
|
closestDistance = dist;
|
||||||
closestClient = i;
|
closestClient = i;
|
||||||
}
|
}
|
||||||
|
@ -397,10 +405,29 @@ static char SMG[8] = "smg";
|
||||||
static char AWP[16] = "sniper_awp";
|
static char AWP[16] = "sniper_awp";
|
||||||
|
|
||||||
public Action Event_ItemPickup(int client, int weapon) {
|
public Action Event_ItemPickup(int client, int weapon) {
|
||||||
if(IsTrollActive(client, "No Pickup")) {
|
static int NoPickupIndex;
|
||||||
return Plugin_Stop;
|
if(NoPickupIndex == 0) NoPickupIndex = GetTrollID("No Pickup");
|
||||||
}else{
|
static char wpnName[64];
|
||||||
static char wpnName[64];
|
if(Trolls[NoPickupIndex].IsActive(client)) {
|
||||||
|
int flags = Trolls[NoPickupIndex].activeFlagClients[client];
|
||||||
|
if(flags & 1 && GetPlayerWeaponSlot(client, view_as<int>(L4DWeaponSlot_Primary)) == weapon) {
|
||||||
|
// No Primary
|
||||||
|
return Plugin_Stop;
|
||||||
|
} else if(flags & 2 && StrEqual(wpnName, "weapon_melee")) {
|
||||||
|
// No melee
|
||||||
|
return Plugin_Stop;
|
||||||
|
} else if(flags & 4 && GetPlayerWeaponSlot(client, view_as<int>(L4DWeaponSlot_Grenade)) == weapon) {
|
||||||
|
// No throwables
|
||||||
|
return Plugin_Stop;
|
||||||
|
} else if(flags & 8 && StrEqual(wpnName, "weapon_first_aid_kit")) {
|
||||||
|
// No Kits
|
||||||
|
return Plugin_Stop;
|
||||||
|
} else if(flags & 16 && GetPlayerWeaponSlot(client, view_as<int>(L4DWeaponSlot_Pills)) == weapon) {
|
||||||
|
// No Pills / Adr
|
||||||
|
return Plugin_Stop;
|
||||||
|
}
|
||||||
|
return Plugin_Continue;
|
||||||
|
} else {
|
||||||
GetEdictClassname(weapon, wpnName, sizeof(wpnName));
|
GetEdictClassname(weapon, wpnName, sizeof(wpnName));
|
||||||
if(strcmp(wpnName[7], "rifle") >= 0
|
if(strcmp(wpnName[7], "rifle") >= 0
|
||||||
|| strcmp(wpnName[7], "smg") >= 0
|
|| strcmp(wpnName[7], "smg") >= 0
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue