Skip to content

Commit e4ab57a

Browse files
committed
Merge branch 'release/1.1.0'
2 parents 568d63a + 715d3b8 commit e4ab57a

2 files changed

Lines changed: 70 additions & 19 deletions

File tree

plugins/engipads.smx

796 Bytes
Binary file not shown.

scripting/engipads.sp

Lines changed: 70 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99

1010
//Define version number in a needlessly complex way
1111
#define MAJOR "1"
12-
#define MINOR "0"
13-
#define PATCH "2"
12+
#define MINOR "1"
13+
#define PATCH "0"
1414
#define PLUGIN_VERSION MAJOR..."."...MINOR..."."...PATCH
1515

1616
//Debug "Mode"
@@ -58,6 +58,8 @@ enum //CvarName
5858
JumpCooldown,
5959
BoostDuration,
6060
BoostSpeed,
61+
BoostDamage,
62+
BoostAirblast,
6163
BoostBlockAiming,
6264
BoostCooldown,
6365
BotsCanBuild,
@@ -76,6 +78,8 @@ enum //Plugin Enabled states
7678
/* Global vars */
7779
static int g_iPadType[2048];
7880
static int g_iObjectParticle[2048];
81+
static int g_iPlayerDamageTaken[MAXPLAYERS + 1];
82+
static float g_flPlayerBoostEndTime[MAXPLAYERS + 1];
7983
static PadCond g_fPadCondFlags[MAXPLAYERS + 1];
8084

8185
static char g_szOffsetStartProp[64];
@@ -142,6 +146,8 @@ public void OnPluginStart()
142146
cvarPads[JumpCooldown] = CreateConVar("pads_jump_cooldown", "3.0", "How long, in seconds, should Jump Pads take to recharge?", FCVAR_NOTIFY, true, 0.1);
143147
cvarPads[BoostDuration] = CreateConVar("pads_boost_duration", "5.0", "How long, in seconds, should Boost Pads boost players for?", FCVAR_NOTIFY, true, 0.0);
144148
cvarPads[BoostSpeed] = CreateConVar("pads_boost_speed", "520.0", "What minimum speed should players be boosted to when using Boost Pads?", FCVAR_NOTIFY, true, 0.0);
149+
cvarPads[BoostDamage] = CreateConVar("pads_boost_damage_threshold", "35", "How much damage can a boosted player take before losing their boost? 0 to disable.", FCVAR_NOTIFY, true, 0.0);
150+
cvarPads[BoostAirblast] = CreateConVar("pads_boost_airblast", "1", "Should boosted players lose their boost when airblasted?", FCVAR_NOTIFY, true, 0.0, true, 1.0);
145151
cvarPads[BoostBlockAiming] = CreateConVar("pads_boost_block_aiming", "1", "Set to 1 to prevent scoped-in/revved up players from being speed boosted.", FCVAR_NOTIFY, true, 0.0, true, 1.0);
146152
cvarPads[BoostCooldown] = CreateConVar("pads_boost_cooldown", "3.0", "How long in seconds should Boost Pads take to recharge?", FCVAR_NOTIFY, true, 0.1);
147153
cvarPads[BotsCanBuild] = CreateConVar("pads_bots_can_build", "0", "If enabled, Bots will build Boost Pads instead of Teleporters.", FCVAR_NOTIFY, true, 0.0, true, 1.0);
@@ -159,6 +165,7 @@ public void OnPluginStart()
159165
cvarPads[PadsAnnounce].AddChangeHook(CvarChange);
160166

161167
HookEvent("player_death", PlayerDeath, EventHookMode_Post);
168+
HookEvent("player_hurt", PlayerHurt, EventHookMode_Post);
162169

163170
HookEvent("player_builtobject", ObjectBuilt, EventHookMode_Post);
164171
HookEvent("player_sapped_object", ObjectSapped, EventHookMode_Post);
@@ -167,7 +174,14 @@ public void OnPluginStart()
167174
HookEvent("object_destroyed", ObjectDestroyed, EventHookMode_Post);
168175
HookEvent("object_removed", ObjectDestroyed, EventHookMode_Post);
169176

177+
HookEvent("object_deflected", ObjectDeflected, EventHookMode_Post);
178+
170179
AddNormalSoundHook(HookSound);
180+
181+
for (int i = 1; i <= MaxClients; i++)
182+
{
183+
OnClientPostAdminCheck(i);
184+
}
171185
}
172186

173187
public void OnPluginEnd()
@@ -274,19 +288,55 @@ public void OnMapEnd()
274288

275289
public void OnClientPostAdminCheck(int iClient)
276290
{
277-
//Reset players' custom conditions on connect
291+
//Reset players' global vars on connect/disconnect/death/pluginstart
278292
Pad_SetConds(iClient, PadCond_None);
293+
g_iPlayerDamageTaken[iClient] = 0;
294+
g_flPlayerBoostEndTime[iClient] = 0.0;
279295
}
280296

281297
public void OnClientDisconnect(int iClient)
282298
{
283-
Pad_SetConds(iClient, PadCond_None);
299+
OnClientPostAdminCheck(iClient);
284300
}
285301

286302
public void PlayerDeath(Event event, const char[] name, bool dontBroadcast)
287303
{
288304
int iClient = GetClientOfUserId(event.GetInt("userid"));
289-
Pad_SetConds(iClient, PadCond_None);
305+
if (IsValidClient(iClient))
306+
OnClientPostAdminCheck(iClient);
307+
}
308+
309+
public void PlayerHurt(Event event, const char[] name, bool dontBroadcast)
310+
{
311+
if (cvarPads[BoostDamage].IntValue <= 0)
312+
return;
313+
314+
int iVictim = GetClientOfUserId(event.GetInt("userid"));
315+
int iAttacker = GetClientOfUserId(event.GetInt("attacker"));
316+
int iDamage = event.GetInt("damageamount");
317+
318+
if (iAttacker != iVictim && Pad_IsPlayerInCond(iVictim, PadCond_Boost)) //Ignore self damage
319+
{
320+
g_iPlayerDamageTaken[iVictim] += iDamage;
321+
if (g_iPlayerDamageTaken[iVictim] >= cvarPads[BoostDamage].IntValue)
322+
{
323+
g_flPlayerBoostEndTime[iVictim] = 0.0;
324+
}
325+
}
326+
}
327+
328+
public void ObjectDeflected(Event event, const char[] name, bool dontBroadcast)
329+
{
330+
if (!cvarPads[BoostAirblast].BoolValue)
331+
return;
332+
333+
int iOwner = GetClientOfUserId(event.GetInt("ownerid"));
334+
int iWeapon = event.GetInt("weaponid");
335+
336+
if (!iWeapon && IsValidClient(iOwner) && Pad_IsPlayerInCond(iOwner, PadCond_Boost)) //0 means ownerid was airblasted
337+
{
338+
g_flPlayerBoostEndTime[iOwner] = 0.0;
339+
}
290340
}
291341

292342
public void ObjectBuilt(Event event, const char[] name, bool dontBroadcast)
@@ -520,8 +570,9 @@ public Action OnPadTouch(int iPad, int iToucher)
520570
TF2_AddCondition(iToucher, TFCond_TeleportedGlow, flDur);
521571
Pad_AddCond(iToucher, PadCond_DelayResponse);
522572

523-
SDKHook(iToucher, SDKHook_PreThink, PreThink);
524-
CreateTimer(flDur, Timer_EndBoostEffect, EntIndexToEntRef(iToucher), TIMER_FLAG_NO_MAPCHANGE);
573+
SDKHook(iToucher, SDKHook_PreThink, OnPreThink);
574+
g_flPlayerBoostEndTime[iToucher] = GetGameTime() + flDur;
575+
g_iPlayerDamageTaken[iToucher] = 0;
525576

526577
TF2_SetBuildingState(iPad, TELEPORTER_STATE_RECEIVING_RELEASE);
527578

@@ -586,12 +637,17 @@ public Action OnPadTouch(int iPad, int iToucher)
586637
}
587638

588639
/* Boost Pad Effects */
589-
public void PreThink(int iClient)
640+
public void OnPreThink(int iClient)
590641
{
591-
if (!Pad_IsPlayerInCond(iClient, PadCond_Boost))
642+
if (g_flPlayerBoostEndTime[iClient] <= GetGameTime() || !Pad_IsPlayerInCond(iClient, PadCond_Boost)) //If the player's boost duration is over, or they're still hooked without the boost cond.
592643
{
593644
if (IsPlayerAlive(iClient))
594645
{
646+
g_flPlayerBoostEndTime[iClient] = 0.0;
647+
g_iPlayerDamageTaken[iClient] = 0;
648+
Pad_RemoveCond(iClient, PadCond_Boost);
649+
TF2_RemoveCondition(iClient, TFCond_TeleportedGlow);
650+
TF2_RemoveCondition(iClient, TFCond_SpeedBuffAlly);
595651
TF2_AddCondition(iClient, TFCond_SpeedBuffAlly, 0.01); //Recalc player's speed so they don't keep the boost forever
596652

597653
if (Pad_IsPlayerInCond(iClient, PadCond_DelayResponse))
@@ -602,8 +658,12 @@ public void PreThink(int iClient)
602658
TF2_SayTeleportResponse(iClient);
603659
}
604660
}
661+
662+
#if defined DEBUG
663+
PrintToChatAll("%N's Boost Ended!", iClient);
664+
#endif
605665
}
606-
SDKUnhook(iClient, SDKHook_PreThink, PreThink);
666+
SDKUnhook(iClient, SDKHook_PreThink, OnPreThink);
607667
}
608668

609669
else if (Pad_IsPlayerInCond(iClient, PadCond_Boost))
@@ -617,15 +677,6 @@ public void PreThink(int iClient)
617677
}
618678
}
619679

620-
public Action Timer_EndBoostEffect(Handle hTimer, any iRef)
621-
{
622-
int iClient = EntRefToEntIndex(iRef);
623-
624-
Pad_RemoveCond(iClient, PadCond_Boost);
625-
626-
return Plugin_Handled;
627-
}
628-
629680
/* Jump Pad Effects */
630681
void LaunchPlayer(int iClient)
631682
{

0 commit comments

Comments
 (0)