From f780a626f040416816fe21278d0b60dd5a3a480a Mon Sep 17 00:00:00 2001 From: neon <> Date: Mon, 8 Oct 2018 18:53:20 +0200 Subject: [PATCH] BossHP: blub --- BossHP/scripting/BossHP.sp | 105 +++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/BossHP/scripting/BossHP.sp b/BossHP/scripting/BossHP.sp index 501ece20..8e49e088 100644 --- a/BossHP/scripting/BossHP.sp +++ b/BossHP/scripting/BossHP.sp @@ -312,6 +312,9 @@ public void OnMapStart() OnEntitySpawned(entity); } } + + AddFileToDownloadsTable("materials/overlays/hitmarker/hitmarkerv2.vmt"); + AddFileToDownloadsTable("materials/overlays/hitmarker/hitmarkerv2.vtf"); } public void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast) @@ -434,6 +437,62 @@ public void OnEntitySpawned(int entity) LogMessage("Hooked killtrigger %s:%s", sKillTrigger, sKillOutput); } } + + for(int i = 0; i < g_aConfig.Length; i++) + { + CConfig _Config = g_aConfig.Get(i); + + if (_Config.IsCounter) + { + CConfigCounter Config = view_as(_Config); + char sTargetName[64]; + Config.GetCounter(sTargetName, sizeof(sTargetName)); + + char sOperation[64]; + if (Config.bCounterReverse) + sOperation = "Add"; + else + sOperation = "Subtract"; + + if (FindOutput(entity, "m_OnHealthChanged", 0, sTargetName, sOperation) != -1) + HookSingleEntityOutput(entity, "OnHealthChanged", HookCallbackDamagedBoss, false); + + if (FindOutput(entity, "m_OnDamaged", 0, sTargetName, sOperation) != -1) + HookSingleEntityOutput(entity, "OnDamaged", HookCallbackDamagedBoss, false); + + } + else if (_Config.IsHPBar) + { + CConfigCounter Config = view_as(_Config); + char sTargetName[64]; + Config.GetCounter(sTargetName, sizeof(sTargetName)); + + char sOperation[64]; + if (Config.bCounterReverse) + sOperation = "Add"; + else + sOperation = "Subtract"; + + if (FindOutput(entity, "m_OnHealthChanged", 0, sTargetName, sOperation) != -1) + HookSingleEntityOutput(entity, "OnHealthChanged", HookCallbackDamagedBoss, false); + + if (FindOutput(entity, "m_OnDamaged", 0, sTargetName, sOperation) != -1) + HookSingleEntityOutput(entity, "OnDamaged", HookCallbackDamagedBoss, false); + } + else if (_Config.IsBreakable) + { + CConfigBreakable Config = view_as(_Config); + char sTargetNameCfg[64]; + Config.GetBreakable(sTargetNameCfg, sizeof(sTargetNameCfg)); + + char sTargetName[64]; + GetEntPropString(entity, Prop_Data, "m_iName", sTargetName, sizeof(sTargetName)); + + if (StrEqual(sTargetNameCfg, sTargetName)) + HookSingleEntityOutput(entity, "OnHealthChanged", HookCallbackDamagedBoss, false); + + } + } } void OnTrigger(int entity, const char[] output, SDKHookType HookType = view_as(-1)) @@ -870,6 +929,7 @@ bool BossInit(CBoss _Boss) } Boss.iBreakableEnt = iBreakableEnt; + } else if(_Boss.IsCounter) { @@ -932,6 +992,7 @@ bool BossInit(CBoss _Boss) int iCounterOnHitMaxCount = GetOutputCount(iCounterEnt, "m_OnHitMax"); Config.bCounterReverse = iCounterOnHitMaxCount > iCounterOnHitMinCount; + } else if(_Boss.IsHPBar) { @@ -1267,3 +1328,47 @@ int FindEntityByTargetname(int entity, const char[] sTargetname, const char[] sC return INVALID_ENT_REFERENCE; } + + +stock int IsValidClient(int client, bool nobots = true) +{ + if (client <= 0 || client > MaxClients || !IsClientConnected(client) || (nobots && IsFakeClient(client))) + return false; + + return IsClientInGame(client); +} + +// Show overlay to a client with lifetime | 0.0 = no auto remove +stock void ShowOverlay(int client, char[] path, float lifetime) +{ + if (!IsClientInGame(client) || IsFakeClient(client) || IsClientSourceTV(client) || IsClientReplay(client)) + return; + + ClientCommand(client, "r_screenoverlay \"%s.vtf\"", path); + + if (lifetime != 0.0) + CreateTimer(lifetime, DeleteOverlay, GetClientUserId(client)); +} + +// Remove overlay from a client - Timer! +stock Action DeleteOverlay(Handle timer, any userid) +{ + int client = GetClientOfUserId(userid); + if (client <= 0 || !IsClientInGame(client) || IsFakeClient(client) || IsClientSourceTV(client) || IsClientReplay(client)) + return; + + ClientCommand(client, "r_screenoverlay \"\""); +} + +public void HookCallbackDamagedBoss(const char[] output, int caller, int activator, float delay) +{ + if (IsValidClient(activator)) + { + int iCurrentCash = GetEntProp(activator, Prop_Send, "m_iAccount"); + + if (iCurrentCash < 16000) + SetEntProp(activator, Prop_Send, "m_iAccount", iCurrentCash + 1); + + ShowOverlay(activator, "overlays/hitmarker/hitmarkerv2", 0.25); + } +}