#pragma semicolon 1
#pragma newdecls required
#include <sdktools_functions>
#include <sdktools_gamerules>
#include <sdktools_tempents>
#include <sdktools_tempents_stocks>
static const int RED[] = {255, 0, 0, 200};
static const char MODEL_CHICKEN[] = "models/chicken/chicken.mdl";
Handle timer;
bool bombCanBounce, bHooked;
int g_iBeamSprite;
float fMin, fMax, fCD;
public Plugin myinfo =
{
name = "[CS:GO] Bouncing Bombs",
author = "Arkarr (rewritten by Grey83)",
description = "Make the C4 bounce everywhere !",
version = "1.0.1",
url = "https://steamcommunity.com/groups/grey83ds"
};
public void OnPluginStart()
{
EngineVersion g_Game = GetEngineVersion();
if(g_Game != Engine_CSGO && g_Game != Engine_CSS)
SetFailState("This plugin is for CSGO/CSS only.");
ConVar CVar;
(CVar = CreateConVar("sm_c4bounce_mini_power", "300.0", "Set the minimal power that the bomb can bounce.", _, true)).AddChangeHook(CVarChanged_Min);
fMin = CVar.FloatValue;
(CVar = CreateConVar("sm_c4bounce_maxi_power", "360.0", "Set the maximal power that the bomb can bounce.", _, true)).AddChangeHook(CVarChanged_Max);
fMax = CVar.FloatValue;
(CVar = CreateConVar("sm_c4bounce_sec_between_bounces", "0.9", "Ammount of seconds before each bounce. 0 = disable bounces", _, true)).AddChangeHook(CVarChanged_CD);
fCD = CVar.FloatValue;
}
public void CVarChanged_Min(ConVar CVar, const char[] oldValue, const char[] newValue)
{
fMin = CVar.FloatValue;
}
public void CVarChanged_Max(ConVar CVar, const char[] oldValue, const char[] newValue)
{
fMax = CVar.FloatValue;
}
public void CVarChanged_CD(ConVar CVar, const char[] oldValue, const char[] newValue)
{
fCD = CVar.FloatValue;
}
public void OnMapStart()
{
if(GameRules_GetProp("m_bMapHasBombTarget"))
{
g_iBeamSprite = PrecacheModel("materials/sprites/laserbeam.vmt");
PrecacheModel(MODEL_CHICKEN);
if(bHooked) return;
HookEvent("bomb_dropped", EVENT_BombDropped, EventHookMode_PostNoCopy);
HookEvent("bomb_pickup", EVENT_BombPickUp, EventHookMode_PostNoCopy);
HookEvent("round_end", EVENT_BombPickUp, EventHookMode_PostNoCopy);
bHooked = true;
}
else if(bHooked)
{
UnhookEvent("bomb_dropped", EVENT_BombDropped, EventHookMode_PostNoCopy);
UnhookEvent("bomb_pickup", EVENT_BombPickUp, EventHookMode_PostNoCopy);
UnhookEvent("round_end", EVENT_BombPickUp, EventHookMode_PostNoCopy);
bHooked = false;
}
}
public void OnClientDisconnect(int client)
{
for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && !IsFakeClient(i))
{
bombCanBounce = true;
return;
}
bombCanBounce = false;
}
public void EVENT_BombPickUp(Handle event, const char[] name, bool dontBroadcast)
{
bombCanBounce = false;
}
public void EVENT_BombDropped(Handle event, const char[] name, bool dontBroadcast)
{
if(!FloatCompare(fCD, 0.0)) return;
int iC4 = -1;
while((iC4 = FindEntityByClassname(iC4, "weapon_c4")) != INVALID_ENT_REFERENCE)
if(IsValidEntity(iC4))
{
bombCanBounce = true;
SetEntityModel(iC4, MODEL_CHICKEN);
BounceC4(iC4);
break;
}
}
stock void BounceC4(int iC4, int iClient = 0)
{
if(timer) delete timer;
if(bombCanBounce)
timer = CreateTimer(fCD, TMR_Bounce, iC4, TIMER_REPEAT);
}
public Action TMR_Bounce(Handle tmr, any iC4)
{
if(!IsValidEntity(iC4) || !bombCanBounce)
{
timer = null;
return Plugin_Stop;
}
static float angles[3];
angles[0] = GetRandomFloat(-180.0, 180.0);
angles[1] = GetRandomFloat(-180.0, 180.0);
angles[2] = GetRandomFloat(fMin, fMax);
TeleportEntity(iC4, NULL_VECTOR, NULL_VECTOR, angles);
TE_SetupBeamFollow(iC4, g_iBeamSprite, 0, 0.8, 1.0, 1.0, 1, RED);
TE_SendToAll();
return Plugin_Continue;
}