/* * Author: Needles * https://steamcommunity.com/profiles/76561198026257137/ */ printl("*** HANDLER/SAP_TARGET"); local SapTargetHandler = class extends ::Handler.BaseHandler { /* BASE CLASS self = The entity that the handler is assigned to activator = The entity that assigned the handler time = When this handler was assigned */ eventSapperPlaced = null; eventSapperRemoved = null; removeDelay = null; doConsumeSapper = null; sapper = null; constructor() { base.constructor(); eventSapperPlaced = ::Events.Event(); eventSapperRemoved = ::Events.Event(); removeDelay = 3; // By default, remove a sapper in 1 second. doConsumeSapper = true; sapper = null; } function SapperPlaced(newSapper) { if (sapper != null || newSapper == null || newSapper.IsValid() == false) return; sapper = newSapper; if (doConsumeSapper == true) { local builder = NetProps.GetPropEntity(sapper, "m_hBuilder"); NetProps.SetPropIntArray(builder, "m_iAmmo", 0, TF_AMMO.TF_AMMO_GRENADES2); // MvM Sapper uses this ammo type for(local i = 0; i < ::Const.WEAPONS_MAX; i++) { local weapon = NetProps.GetPropEntityArray(builder, "m_hMyWeapons", i); if (weapon == null || weapon.IsValid() == false) continue; if (weapon.GetClassname() == "tf_weapon_builder") { NetProps.SetPropFloat(weapon, "LocalActiveTFWeaponData.m_flEffectBarRegenTime", Time() + ::Const.WEAPON_SAPPER_RECHARGE_TIME); break; // @TODO - Do we want to break here? What if the builder has multiple tf_weapon_builder items? } } } eventSapperPlaced.FireListeners({sapTarget = this, sapper = sapper}); } function SapperRemoved() { if (sapper == null) return; eventSapperRemoved.FireListeners({sapTarget = this, sapper = sapper}); sapper = null; } function IsSapped() { return (sapper != null); } function OnEvent_Tick(params) { if (sapper == null || !sapper.IsValid()) return; // Deal damage to the attached sapper every tick sapper.TakeDamageCustom( self, // inflictor self, // attacker null, // weapon Vector(0.0, 0.0, 0.0), // force vector sapper.GetOrigin(), // damage position params.time * ::Const.OBJ_SAPPER_HEALTH / removeDelay, // damage amount 0, // damage type Constants.ETFDmgCustom.TF_DMG_WRENCH_FIX // custom damage type ); } function OnEvent_DamagePre(params) { if (params.const_entity == sapper && sapper != null && sapper.IsValid() == true) { if (sapper.GetHealth() - params.damage <= 0.0) SapperRemoved(); } if (params.const_entity != self) return; if (params.attacker != null && params.attacker.IsValid() && params.attacker.GetClassname() == "obj_attachment_sapper") { SapperPlaced(params.attacker); } // Don't take damage at all params.damage = 0.0; } } ::Handler.RegisterHandler("sap_target", @() SapTargetHandler());