Code:
public PlVers:__version =
{
version = 5,
filevers = "1.8.0.6017",
date = "06/02/2018",
time = "18:22:52"
};
new Float:NULL_VECTOR[3];
new String:NULL_STRING[4];
public Extension:__ext_core =
{
name = "Core",
file = "core",
autoload = 0,
required = 0,
};
new MaxClients;
new TFHoliday:TFHoliday_Birthday;
new TFHoliday:TFHoliday_Halloween;
new TFHoliday:TFHoliday_Christmas;
new TFHoliday:TFHoliday_EndOfTheLine;
new TFHoliday:TFHoliday_CommunityUpdate;
new TFHoliday:TFHoliday_ValentinesDay;
new TFHoliday:TFHoliday_MeetThePyro;
new TFHoliday:TFHoliday_SpyVsEngyWar;
new TFHoliday:TFHoliday_FullMoon;
new TFHoliday:TFHoliday_HalloweenOrFullMoon;
new TFHoliday:TFHoliday_HalloweenOrFullMoonOrValentines;
new TFHoliday:TFHoliday_AprilFools;
public Extension:__ext_tf2 =
{
name = "TF2 Tools",
file = "game.tf2.ext",
autoload = 0,
required = 1,
};
public Extension:__ext_tf2items =
{
name = "TF2Items",
file = "tf2items.ext.2.ep2v",
autoload = 0,
required = 1,
};
public Extension:__ext_sdktools =
{
name = "SDKTools",
file = "sdktools.ext",
autoload = 1,
required = 1,
};
new String:TFResourceNames[18][];
public Extension:__ext_regex =
{
name = "Regex Extension",
file = "regex.ext",
autoload = 1,
required = 1,
};
new bool:CSkipList[66] =
{
1634038374, 1868980075, 1701999730, 845116275, 0, 1634038374, 1868980075, 1701999730, 845116275, 2020438830, 0, 2448, 2468, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 845571630, 0, 0, 47, 92, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
new CTeamColors[1][3];
new Handle:CTrie = 1634038374;
public SharedPlugin:__pl_FF2 =
{
name = "freak_fortress_2",
file = "freak_fortress_2.smx",
required = 1,
};
new String:this_plugin_name[80];
new BossTeam = 3;
new SecondsLeft[66];
new BossDamage;
new Handle:hDisableRage[66];
new Handle:hTimerTick[66];
public Plugin:myinfo =
{
name = "Freak Fortress 2: SCP-173 Special Abilities",
description = "",
author = "OriginalNero",
version = "",
url = ""
};
public void:__ext_core_SetNTVOptional()
{
MarkNativeAsOptional("GetFeatureStatus");
MarkNativeAsOptional("RequireFeature");
MarkNativeAsOptional("AddCommandListener");
MarkNativeAsOptional("RemoveCommandListener");
MarkNativeAsOptional("BfWriteBool");
MarkNativeAsOptional("BfWriteByte");
MarkNativeAsOptional("BfWriteChar");
MarkNativeAsOptional("BfWriteShort");
MarkNativeAsOptional("BfWriteWord");
MarkNativeAsOptional("BfWriteNum");
MarkNativeAsOptional("BfWriteFloat");
MarkNativeAsOptional("BfWriteString");
MarkNativeAsOptional("BfWriteEntity");
MarkNativeAsOptional("BfWriteAngle");
MarkNativeAsOptional("BfWriteCoord");
MarkNativeAsOptional("BfWriteVecCoord");
MarkNativeAsOptional("BfWriteVecNormal");
MarkNativeAsOptional("BfWriteAngles");
MarkNativeAsOptional("BfReadBool");
MarkNativeAsOptional("BfReadByte");
MarkNativeAsOptional("BfReadChar");
MarkNativeAsOptional("BfReadShort");
MarkNativeAsOptional("BfReadWord");
MarkNativeAsOptional("BfReadNum");
MarkNativeAsOptional("BfReadFloat");
MarkNativeAsOptional("BfReadString");
MarkNativeAsOptional("BfReadEntity");
MarkNativeAsOptional("BfReadAngle");
MarkNativeAsOptional("BfReadCoord");
MarkNativeAsOptional("BfReadVecCoord");
MarkNativeAsOptional("BfReadVecNormal");
MarkNativeAsOptional("BfReadAngles");
MarkNativeAsOptional("BfGetNumBytesLeft");
MarkNativeAsOptional("BfWrite.WriteBool");
MarkNativeAsOptional("BfWrite.WriteByte");
MarkNativeAsOptional("BfWrite.WriteChar");
MarkNativeAsOptional("BfWrite.WriteShort");
MarkNativeAsOptional("BfWrite.WriteWord");
MarkNativeAsOptional("BfWrite.WriteNum");
MarkNativeAsOptional("BfWrite.WriteFloat");
MarkNativeAsOptional("BfWrite.WriteString");
MarkNativeAsOptional("BfWrite.WriteEntity");
MarkNativeAsOptional("BfWrite.WriteAngle");
MarkNativeAsOptional("BfWrite.WriteCoord");
MarkNativeAsOptional("BfWrite.WriteVecCoord");
MarkNativeAsOptional("BfWrite.WriteVecNormal");
MarkNativeAsOptional("BfWrite.WriteAngles");
MarkNativeAsOptional("BfRead.ReadBool");
MarkNativeAsOptional("BfRead.ReadByte");
MarkNativeAsOptional("BfRead.ReadChar");
MarkNativeAsOptional("BfRead.ReadShort");
MarkNativeAsOptional("BfRead.ReadWord");
MarkNativeAsOptional("BfRead.ReadNum");
MarkNativeAsOptional("BfRead.ReadFloat");
MarkNativeAsOptional("BfRead.ReadString");
MarkNativeAsOptional("BfRead.ReadEntity");
MarkNativeAsOptional("BfRead.ReadAngle");
MarkNativeAsOptional("BfRead.ReadCoord");
MarkNativeAsOptional("BfRead.ReadVecCoord");
MarkNativeAsOptional("BfRead.ReadVecNormal");
MarkNativeAsOptional("BfRead.ReadAngles");
MarkNativeAsOptional("BfRead.GetNumBytesLeft");
MarkNativeAsOptional("PbReadInt");
MarkNativeAsOptional("PbReadFloat");
MarkNativeAsOptional("PbReadBool");
MarkNativeAsOptional("PbReadString");
MarkNativeAsOptional("PbReadColor");
MarkNativeAsOptional("PbReadAngle");
MarkNativeAsOptional("PbReadVector");
MarkNativeAsOptional("PbReadVector2D");
MarkNativeAsOptional("PbGetRepeatedFieldCount");
MarkNativeAsOptional("PbSetInt");
MarkNativeAsOptional("PbSetFloat");
MarkNativeAsOptional("PbSetBool");
MarkNativeAsOptional("PbSetString");
MarkNativeAsOptional("PbSetColor");
MarkNativeAsOptional("PbSetAngle");
MarkNativeAsOptional("PbSetVector");
MarkNativeAsOptional("PbSetVector2D");
MarkNativeAsOptional("PbAddInt");
MarkNativeAsOptional("PbAddFloat");
MarkNativeAsOptional("PbAddBool");
MarkNativeAsOptional("PbAddString");
MarkNativeAsOptional("PbAddColor");
MarkNativeAsOptional("PbAddAngle");
MarkNativeAsOptional("PbAddVector");
MarkNativeAsOptional("PbAddVector2D");
MarkNativeAsOptional("PbRemoveRepeatedFieldValue");
MarkNativeAsOptional("PbReadMessage");
MarkNativeAsOptional("PbReadRepeatedMessage");
MarkNativeAsOptional("PbAddMessage");
MarkNativeAsOptional("Protobuf.ReadInt");
MarkNativeAsOptional("Protobuf.ReadFloat");
MarkNativeAsOptional("Protobuf.ReadBool");
MarkNativeAsOptional("Protobuf.ReadString");
MarkNativeAsOptional("Protobuf.ReadColor");
MarkNativeAsOptional("Protobuf.ReadAngle");
MarkNativeAsOptional("Protobuf.ReadVector");
MarkNativeAsOptional("Protobuf.ReadVector2D");
MarkNativeAsOptional("Protobuf.GetRepeatedFieldCount");
MarkNativeAsOptional("Protobuf.SetInt");
MarkNativeAsOptional("Protobuf.SetFloat");
MarkNativeAsOptional("Protobuf.SetBool");
MarkNativeAsOptional("Protobuf.SetString");
MarkNativeAsOptional("Protobuf.SetColor");
MarkNativeAsOptional("Protobuf.SetAngle");
MarkNativeAsOptional("Protobuf.SetVector");
MarkNativeAsOptional("Protobuf.SetVector2D");
MarkNativeAsOptional("Protobuf.AddInt");
MarkNativeAsOptional("Protobuf.AddFloat");
MarkNativeAsOptional("Protobuf.AddBool");
MarkNativeAsOptional("Protobuf.AddString");
MarkNativeAsOptional("Protobuf.AddColor");
MarkNativeAsOptional("Protobuf.AddAngle");
MarkNativeAsOptional("Protobuf.AddVector");
MarkNativeAsOptional("Protobuf.AddVector2D");
MarkNativeAsOptional("Protobuf.RemoveRepeatedFieldValue");
MarkNativeAsOptional("Protobuf.ReadMessage");
MarkNativeAsOptional("Protobuf.ReadRepeatedMessage");
MarkNativeAsOptional("Protobuf.AddMessage");
VerifyCoreVersion();
return void:0;
}
GetThisPluginName()
{
decl String:pluginName[80];
GetPluginFilename(Handle:0, pluginName, 80);
ReplaceString(pluginName, 80, ".ff2", "", false);
new forwardSlash = -1;
new backwardSlash = -1;
new finalPluginName = -1;
do {
forwardSlash = StrContains(pluginName[finalPluginName + 1], "/", true);
backwardSlash = StrContains(pluginName[finalPluginName + 1], "\", true);
new var1;
if ((backwardSlash < forwardSlash && backwardSlash != -1) || forwardSlash == -1)
{
if (!(backwardSlash == -1))
{
finalPluginName = backwardSlash;
}
}
else
{
new var3;
if ((forwardSlash < backwardSlash && forwardSlash != -1) || backwardSlash == -1)
{
if (!(forwardSlash == -1))
{
finalPluginName = forwardSlash;
}
}
}
strcopy(this_plugin_name, 80, pluginName[finalPluginName + 1]);
return 0;
} while (true);
}
public void:OnPluginStart()
{
OnPluginStart2();
GetThisPluginName();
return void:0;
}
public Action:FF2_OnAbility(client, String:plugin_name[], String:ability_name[], status)
{
if (plugin_name[0])
{
if (strcmp(this_plugin_name, plugin_name, true))
{
return Action:0;
}
}
FF2_OnAbility2(client, plugin_name, ability_name, status);
return Action:0;
}
public OnPluginStart2()
{
HookEvent("teamplay_round_win", OnRoundEnd, EventHookMode:1);
HookEvent("teamplay_round_start", OnRoundStart, EventHookMode:1);
return 0;
}
public Action:OnRoundEnd(Handle:event, String:name[], bool:dontBroadcast)
{
TurnOnLights();
ResetHandles();
return Action:0;
}
public Action:OnRoundStart(Handle:event, String:name[], bool:dontBroadcast)
{
TurnOnLights();
ResetHandles();
return Action:0;
}
public Action:FF2_OnAbility2(boss, String:plugin_name[], String:ability_name[], status)
{
if (!strcmp(ability_name, "ff2_scp", true))
{
new client = GetClientOfUserId(FF2_GetBossUserId(boss));
new Float:position[3] = 0.0;
new bool:otherTeamIsAlive;
new target = 1;
while (target <= MaxClients)
{
new var1;
if (IsClientInGame(target) && IsPlayerAlive(target) && client != target && !FF2_GetFF2flags(target) & 128)
{
otherTeamIsAlive = true;
if (!otherTeamIsAlive)
{
return Action:0;
}
new target;
new tries;
tries++;
target = GetRandomInt(1, MaxClients);
while (tries == 100)
{
new var2;
if (!(!IsValidEdict(target) || client != target || FF2_GetFF2flags(target) & 128 || !IsPlayerAlive(target)))
{
GetEntPropVector(target, PropType:1, "m_vecOrigin", position, 0);
TeleportEntity(client, position, NULL_VECTOR, NULL_VECTOR);
TF2_AddCondition(client, TFCond:6, FF2_GetAbilityArgumentFloat(boss, this_plugin_name, ability_name, 1, 5.0), 0);
FF2_SetBossCharge(boss, 0, 0.0);
SecondsLeft[client] = RoundToNearest(FF2_GetAbilityArgumentFloat(boss, this_plugin_name, ability_name, 1, 5.0)) + -1;
BossDamage = FF2_GetBossRageDamage(boss);
FF2_SetBossRageDamage(boss, 1000000);
hDisableRage[client] = CreateTimer(0.1, DisableRage, boss, 1);
hTimerTick[client] = CreateTimer(1.0, TimerTick, boss, 1);
CreateTimer(FF2_GetAbilityArgumentFloat(boss, this_plugin_name, ability_name, 1, 5.0), DeleteTimer, boss, 0);
}
}
return Action:0;
}
target++;
}
if (!otherTeamIsAlive)
{
return Action:0;
}
new target;
new tries;
tries++;
target = GetRandomInt(1, MaxClients);
while (tries == 100)
{
new var2;
if (!(!IsValidEdict(target) || client != target || FF2_GetFF2flags(target) & 128 || !IsPlayerAlive(target)))
{
GetEntPropVector(target, PropType:1, "m_vecOrigin", position, 0);
TeleportEntity(client, position, NULL_VECTOR, NULL_VECTOR);
TF2_AddCondition(client, TFCond:6, FF2_GetAbilityArgumentFloat(boss, this_plugin_name, ability_name, 1, 5.0), 0);
FF2_SetBossCharge(boss, 0, 0.0);
SecondsLeft[client] = RoundToNearest(FF2_GetAbilityArgumentFloat(boss, this_plugin_name, ability_name, 1, 5.0)) + -1;
BossDamage = FF2_GetBossRageDamage(boss);
FF2_SetBossRageDamage(boss, 1000000);
hDisableRage[client] = CreateTimer(0.1, DisableRage, boss, 1);
hTimerTick[client] = CreateTimer(1.0, TimerTick, boss, 1);
CreateTimer(FF2_GetAbilityArgumentFloat(boss, this_plugin_name, ability_name, 1, 5.0), DeleteTimer, boss, 0);
}
}
return Action:0;
}
return Action:0;
}
public void:TF2_OnConditionAdded(player, TFCond:condition)
{
new client = 1;
while (client <= MaxClients)
{
if (FF2_GetBossIndex(client) != -1)
{
new boss = FF2_GetBossIndex(client);
if (FF2_HasAbility(boss, this_plugin_name, "ff2_scp"))
{
new var1;
if (condition == TFCond:6 && client == player)
{
TF2_RemoveCondition(client, TFCond:87);
}
new var2;
if (condition == TFCond:87 && client == player)
{
TurnOnLights();
}
}
}
client++;
}
return void:0;
}
public void:TF2_OnConditionRemoved(player, TFCond:condition)
{
new client = 1;
while (client <= MaxClients)
{
if (FF2_GetBossIndex(client) != -1)
{
new boss = FF2_GetBossIndex(client);
if (FF2_HasAbility(boss, this_plugin_name, "ff2_scp"))
{
new Float:pos[3] = 0.0;
new Float:vec[3] = 0.0;
new var1;
if (condition == TFCond:6 && client == player)
{
GetEntPropVector(client, PropType:1, "m_vecOrigin", pos, 0);
GetEntPropVector(client, PropType:1, "m_vecVelocity", vec, 0);
TF2_AddCondition(client, TFCond:87, -1.0, 0);
TeleportEntity(client, NULL_VECTOR, NULL_VECTOR, 3604);
vec[2] = 0.0;
}
new var2;
if (condition == TFCond:87 && client == player)
{
new target = 1;
while (target <= MaxClients)
{
if (IsValidClient(target, false))
{
new var3;
if (BossTeam != GetClientTeam(target) && player != target)
{
TurnOffLights(GetClientUserId(target));
}
}
target++;
}
}
}
}
client++;
}
return void:0;
}
public Action:DeleteTimer(Handle:timer, any:boss)
{
new client = GetClientOfUserId(FF2_GetBossUserId(boss));
if (IsValidClient(client, false))
{
FF2_SetBossCharge(boss, 0, 0.0);
FF2_SetBossRageDamage(boss, BossDamage);
SecondsLeft[client] = 0;
if (hDisableRage[client])
{
KillTimer(hDisableRage[client], false);
hDisableRage[client] = 0;
}
if (hTimerTick[client])
{
KillTimer(hTimerTick[client], false);
hTimerTick[client] = 0;
}
}
return Action:0;
}
public Action:DisableRage(Handle:timer, any:boss)
{
new client = GetClientOfUserId(FF2_GetBossUserId(boss));
new var1;
if (boss == any:-1 || !IsClientInGame(client) || SecondsLeft[client])
{
return Action:4;
}
FF2_SetBossCharge(boss, 0, 0.0);
return Action:0;
}
public Action:TimerTick(Handle:timer, any:boss)
{
new client = GetClientOfUserId(FF2_GetBossUserId(boss));
new var1;
if (boss == any:-1 || !IsClientInGame(client) || SecondsLeft[client])
{
return Action:4;
}
SecondsLeft[client] += -1;
return Action:0;
}
void:TurnOnLights()
{
SetCommandFlags("r_screenoverlay", GetCommandFlags("r_screenoverlay") & -16385);
new target = 1;
while (target <= MaxClients)
{
if (IsValidClient(target, false))
{
ClientCommand(target, "r_screenoverlay \"\"");
}
target++;
}
SetCommandFlags("r_screenoverlay", GetCommandFlags("r_screenoverlay") & 16384);
return void:0;
}
void:TurnOffLights(userid)
{
new client = GetClientOfUserId(userid);
new flags = GetCommandFlags("r_screenoverlay") & -16385;
SetCommandFlags("r_screenoverlay", flags);
ClientCommand(client, "r_screenoverlay \"%s\"", "Effects/tp_eyefx/tp_black");
SetCommandFlags("r_screenoverlay", GetCommandFlags("r_screenoverlay") & 16384);
return void:0;
}
void:ResetHandles()
{
new player;
while (player <= MaxClients)
{
if (IsValidClient(player, false))
{
if (hDisableRage[player])
{
KillTimer(hDisableRage[player], false);
hDisableRage[player] = 0;
}
if (hTimerTick[player])
{
KillTimer(hTimerTick[player], false);
hTimerTick[player] = 0;
}
}
player++;
}
return void:0;
}
bool:IsValidClient(client, bool:isAlive)
{
new var1;
if (!client || client > MaxClients)
{
return false;
}
if (isAlive)
{
new var2;
return IsClientInGame(client) && IsPlayerAlive(client);
}
return IsClientInGame(client);
}