function MedicBusterController() print("Spawned") --Constants local MEDICBUSTER_MAX_UBERS = 1 --how many ubers until it counts as an offense local MEDICBUSTER_MAX_CANTEENS = 1 --how many canteen uses until it counts as an offense local MEDICBUSTER_MAX_REVIVES_COUNT = 1 --how many revives until it counts as an offense local MEDICBUSTER_MAX_DAMAGEBLOCKED = 750 --how much damage blocked by the shield counts as an offense local MEDICBUSTER_MAX_OFFENSE_COUNT = 2 --how many offenses until a medic buster spawn is dispatched local MEDICBUSTER_OFFENSE_DECREMENT = 1 local MEDICBUSTER_OFFENSE_DECAY_INTERVAL = 35 local waveStartedStatus = false local lastCheckedOffenseCount = 0 local lastCheckedUbers = 0 local lastCheckedDamageBlocked = 0 local lastCheckedCanteens = 0 local lastCheckedRevives = 0 local shieldOwnerMed --here so it can be returned by methods local callbacks = {} local validMeds = {} local MedBusterEnable = ents.FindByName("MedBusterEnable") local MedBusterDisable = ents.FindByName("MedBusterDisable") --handled here so people don't have to worry too much about it in-popfile if MedBusterEnable and MedBusterDisable then print("Found Relays") MedBusterDisable:AcceptInput("Trigger") end --this is here for people who want to get the table of medics, maybe you could feed it into --an interrupt for a sentry buster for a more literal medic buster function MEDICBUSTER_GetValidMeds() return validMeds end function MEDICBUSTER_GetMedShieldOwner() return shieldOwnerMed end --Setter methods to control when medic buster spawns occur function MEDICBUSTER_SetMaxUbers(maxUbers) MEDICBUSTER_MAX_UBERS = maxUbers end function MEDICBUSTER_SetMaxRevives(maxRevives) MEDICBUSTER_MAX_REVIVES_COUNT = maxRevives end function MEDICBUSTER_SetMaxCanteenShares(maxCanteens) MEDICBUSTER_MAX_CANTEENS = maxCanteens end function MEDICBUSTER_SetMaxDamageBlocked(maxBlocked) MEDICBUSTER_MAX_DAMAGEBLOCKED = maxBlocked end function MEDICBUSTER_SetMaxOffenseCount(maxOffenseCount) MEDICBUSTER_MAX_OFFENSE_COUNT = maxOffenseCount end function MEDICBUSTER_SetOffenseDecrement(offenseDecrement) MEDICBUSTER_OFFENSE_DECREMENT = offenseDecrement end local monitorMeds monitorMeds = timer.Create(0.015, function() validMeds = {} --print(waveStartedStatus) --Build table and act on data collected by eventcallbacks local allPlayers = ents.GetAllPlayers() --print(waveStartedStatus) --print("Using normal table iteration") for _, player in pairs(allPlayers) do if player.m_iClass == 5 and player:IsRealPlayer() == true and player:IsAlive() then table.insert(validMeds, player) end end --PrintTable(validMeds) if lastCheckedUbers >= MEDICBUSTER_MAX_UBERS then lastCheckedOffenseCount = lastCheckedOffenseCount + 1 lastCheckedUbers = 0 end if lastCheckedDamageBlocked >= MEDICBUSTER_MAX_DAMAGEBLOCKED then lastCheckedOffenseCount = lastCheckedOffenseCount + 1 lastCheckedDamageBlocked = 0 print("Max damage blocked exceeded, incrementing offense count") end if lastCheckedCanteens >= MEDICBUSTER_MAX_CANTEENS then lastCheckedOffenseCount = lastCheckedOffenseCount + 1 lastCheckedCanteens = 0 end if lastCheckedRevives >= MEDICBUSTER_MAX_REVIVES_COUNT then lastCheckedOffenseCount = lastCheckedOffenseCount + 1 lastCheckedRevives = 0 end if lastCheckedOffenseCount > MEDICBUSTER_MAX_OFFENSE_COUNT and waveStartedStatus == true then if IsValid(MedBusterEnable) and IsValid(MedBusterDisable) then MedBusterEnable:AcceptInput("Trigger") print("Offense count exceeded maximum, deploying med buster spawns") lastCheckedOffenseCount = 0 lastCheckedUbers = 0 lastCheckedDamageBlocked = 0 lastCheckedCanteens = 0 lastCheckedRevives = 0 timer.Simple(1 ,function() MedBusterDisable:AcceptInput("Trigger") print("Spawn disabled") end) else print("Error, med buster controllers not available") lastCheckedOffenseCount = 0 lastCheckedUbers = 0 lastCheckedDamageBlocked = 0 lastCheckedCanteens = 0 lastCheckedRevives = 0 end end --print(lastCheckedOffenseCount) end, 0) local offenseDecay offenseDecay = timer.Create(MEDICBUSTER_OFFENSE_DECAY_INTERVAL, function() print("Checking if offense count is above 0") if lastCheckedOffenseCount > 0 then lastCheckedOffenseCount = lastCheckedOffenseCount - 1 print("Offense count decremented after " .. MEDICBUSTER_OFFENSE_DECAY_INTERVAL .. " seconds") end end, 0) --Collect data with table as reference and feed it back to monitorMeds --Event tracking vars and callbacks callbacks.deployCharge = AddEventCallback("player_chargedeployed", function (eventTable) local uberedMedic = ents.GetPlayerByUserId(eventTable.userid) print("Noticed Uber") for _, player in pairs(validMeds) do if uberedMedic == player then print("Charge deployed! Incrementing uber count") lastCheckedUbers = lastCheckedUbers + 1 end end end) local function AcknowledgeShield(shield) shieldOwnerMed = shield.m_hOwnerEntity shield:AddCallback(ON_DAMAGE_RECEIVED_POST, function(_, damageinfo) --print("Noticed Block") if damageinfo.Weapon then local damageWeapon = damageinfo.Weapon --drop med shield whenever something with this specific value in the description field hits it if damageWeapon:GetAttributeValue("special item description", true) == "DROPSHIELDONHIT" then --print("Med shield dropped!") shieldOwnerMed.m_flRageMeter = 0.01 local sound = "ambient/energy/zap9.wav" shieldOwnerMed:AcceptInput("$PlaySound", sound) end end lastCheckedDamageBlocked = lastCheckedDamageBlocked + damageinfo.Damage timer.Simple(0.1, function() if not IsValid(shield) then return end end) end) end callbacks.canteenShare = AddEventCallback("player_used_powerup_bottle", function (eventTable) print("Noticed Share") local sharingMedic = eventTable.player for _, player in pairs(validMeds) do if sharingMedic == player:GetNetIndex() then print("Canteen Shared! Incrementing Shared Canteen Amount") lastCheckedCanteens = lastCheckedCanteens + 1 end end end) callbacks.shieldDamaged = ents.AddCreateCallback("entity_medigun_shield", function(ent) timer.Simple(0, function() for _, player in pairs(validMeds) do if ent.m_hOwnerEntity == player then AcknowledgeShield(ent) --print("we're listening") else return end end end) end) callbacks.playerKilled = AddEventCallback("player_death", function(eventTable) local victim = Entity(eventTable.victim_entindex) for _, player in pairs(validMeds) do if victim == player then print("Noted med death, reducing offense count") if lastCheckedOffenseCount > MEDICBUSTER_OFFENSE_DECREMENT - 1 then lastCheckedOffenseCount = lastCheckedOffenseCount - 2 else lastCheckedOffenseCount = 0 end end end end) --it is safe to assume that if revives are happening, it is a human medic doing it callbacks.playerRevive = AddEventCallback("revive_player_complete", function(eventTable) lastCheckedRevives = lastCheckedRevives + 1 print("Noticed Revive") end) callbacks.waveStart = AddEventCallback("mvm_begin_wave", function() waveStartedStatus = true lastCheckedOffenseCount = 0 lastCheckedUbers = 0 lastCheckedDamageBlocked = 0 lastCheckedCanteens = 0 lastCheckedRevives = 0 end) callbacks.waveReset = AddEventCallback("mvm_reset_stats", function () print("cleaning up old object") RemoveEventCallback(callbacks.deployCharge) RemoveEventCallback(callbacks.canteenShare) RemoveEventCallback(callbacks.waveStart) RemoveEventCallback(callbacks.playerKilled) RemoveEventCallback(callbacks.waveReset) timer.Stop(monitorMeds) timer.Stop(offenseDecay) end) end