::MAX_WEAPONS_HARV <- 8 if("HarvesterWeaponCallbacks" in getroottable()) { delete ::HarvesterWeaponCallbacks } ::HarvesterWeaponCallbacks <- { missionName = null Cleanup = function() { if(missionName != NetProps.GetPropString(Entities.FindByClassname(null, "tf_objective_resource"), "m_iszMvMPopfileName")) { delete ::HarvesterWeaponCallbacks } } // mandatory events OnGameEvent_recalculate_holidays = function(_) { if (GetRoundState() == 3) { Cleanup() } } OnGameEvent_post_inventory_application = function(params) { local player = GetPlayerFromUserID(params.userid) if(IsPlayerABot(player)) { return } local scope = player.GetScriptScope() local m_1 = NetProps.GetPropIntArray(player, "m_iAmmo", 1) local m_2 = NetProps.GetPropIntArray(player, "m_iAmmo", 2) local m_3 = NetProps.GetPropIntArray(player, "m_iAmmo", 3) // ClientPrint(null, 3, "Updated max metal to: " + m_3) scope.max_primary_ammo <- m_1 scope.max_secondary_ammo <- m_2 scope.max_metal <- m_3 } setChargeMeterWithCap = function(receiver, meter_name, boost, multiplier=1, arraySlot=-1) { local charge_meter = NetProps.GetPropFloat(receiver, meter_name) // ClientPrint(null,3,"Modifying " + meter_name) // ClientPrint(null,3,"Old meter " + charge_meter) local new_charge_meter = charge_meter + (boost * multiplier) > (1 * multiplier) ? (1 * multiplier) : charge_meter + (boost * multiplier) // ClientPrint(null,3,"New meter " + new_charge_meter) NetProps.SetPropFloat(receiver, meter_name, new_charge_meter) } rewardHarvester = function(receiver, health, cap_health, ammo, cap_ammo, crits, meters, aoe, uber=0, victim=null) { local r_scope = receiver.GetScriptScope() //Healing local r_health = receiver.GetHealth() local r_max_health = receiver.GetMaxHealth() if(!cap_health) { receiver.SetHealth(r_health + (health * r_max_health)) } else if(r_health < (r_max_health * 2)) { local new_health = r_health + (health * r_max_health) if (new_health > (r_max_health * 2)) { receiver.SetHealth(r_max_health * 2) } else { receiver.SetHealth(new_health) } } //Ammo local r_primary_ammo = NetProps.GetPropIntArray(receiver, "m_iAmmo", 1) local r_secondary_ammo = NetProps.GetPropIntArray(receiver, "m_iAmmo", 2) local r_metal = NetProps.GetPropIntArray(receiver, "m_iAmmo", 3) local new_primary_ammo = (r_primary_ammo + (r_scope.max_primary_ammo * ammo)) local new_secondary_ammo = (r_secondary_ammo + (r_scope.max_secondary_ammo * ammo)) local new_metal = (r_metal + (r_scope.max_metal * ammo)) if(cap_ammo) { if(new_primary_ammo > (r_scope.max_primary_ammo)) { if(r_primary_ammo > r_scope.max_primary_ammo) { new_primary_ammo = r_primary_ammo } else { new_primary_ammo = r_scope.max_primary_ammo } } if(new_secondary_ammo > (r_scope.max_secondary_ammo)) { if(r_secondary_ammo > r_scope.max_secondary_ammo) { new_secondary_ammo = r_secondary_ammo } else { new_secondary_ammo = r_scope.max_secondary_ammo } } if(new_metal > (r_scope.max_metal)) { if(r_metal > r_scope.max_metal) { new_metal = r_metal } else { new_metal = r_scope.max_metal } } } NetProps.SetPropIntArray(receiver, "m_iAmmo", (new_primary_ammo), 1) NetProps.SetPropIntArray(receiver, "m_iAmmo", (new_secondary_ammo), 2) NetProps.SetPropIntArray(receiver, "m_iAmmo", (new_metal), 3) //Crits and misc buffs receiver.AddCondEx(34, crits, null) if(receiver.GetPlayerClass() == 7 && aoe) { receiver.AddCustomAttribute("dmg penalty vs players", 1.3, crits) } else if(receiver.GetPlayerClass() == 2 && aoe) { receiver.AddCustomAttribute("dmg penalty vs players", 2, crits) } else if(receiver.GetPlayerClass() == 2 && !aoe) { receiver.AddCustomAttribute("dmg penalty vs players", 1.5, crits) } else if(receiver.GetPlayerClass() == 8 && aoe) { receiver.AddCustomAttribute("fire rate bonus", 0.4, crits) } else if(receiver.GetPlayerClass() == 8 && !aoe) { receiver.AddCustomAttribute("fire rate bonus", 0.6, crits) } //Meters // setChargeMeterWithCap(receiver, "m_flCloakMeter", meters) // setChargeMeterWithCap(receiver, "m_flEnergyDrinkMeter", meters) // setChargeMeterWithCap(receiver, "m_flRageMeter", meters) // local shield = null // while(shield = Entities.FindByClassname(shield, "tf_wearable_demoshield")) { // if(shield.GetOwner() == receiver) { //only need to find one entity // // ClientPrint(null, 3, "Found one!") // setChargeMeterWithCap(shield, "m_flChargeMeter", meters, 100) // break; // } // } for (local i = 0; i < MAX_WEAPONS_HARV; i++) { local weapon = NetProps.GetPropEntityArray(receiver, "m_hMyWeapons", i) if (weapon == null) continue setChargeMeterWithCap(weapon, "m_flEffectBarRegenTime", meters, 100) } if(aoe) { ClientPrint(null, 3, "\x07FF3F3F" + Convars.GetClientConvarValue("name", receiver.entindex()) + " \x07FBECCBhas harvested a \x0799CCFF" + Convars.GetClientConvarValue("name", victim.entindex()) + "!") } if(uber != 0) { receiver.AddCondEx(72, uber, null) receiver.AddCondEx(52, uber, null) } //Ubercharges and shields if(receiver.GetPlayerClass() != 5) { return } // ClientPrint(null,3,"Attempting to give uber!") if(!("medigun" in r_scope) || !(r_scope.medigun.IsValid())) { r_scope.medigun <- null for(local i = 0; i < NetProps.GetPropArraySize(receiver, "m_hMyWeapons"); i++) { local wep = NetProps.GetPropEntityArray(receiver, "m_hMyWeapons", i) if(wep && wep.GetClassname() == "tf_weapon_medigun") { r_scope.medigun = NetProps.GetPropEntityArray(receiver, "m_hMyWeapons", i); break; } } } if(r_scope.medigun == null) { // ClientPrint(null, 3, "There are no medi guns?!") return } // ClientPrint(null, 3, "SSSS?!") local rageBoost = meters * 100 local uberMeter = NetProps.GetPropFloat(r_scope.medigun, "m_flChargeLevel") local newUberMeter = uberMeter + meters < 1 ? uberMeter + meters : 1 NetProps.SetPropFloat(r_scope.medigun, "m_flChargeLevel", newUberMeter) if(r_scope.medigun.GetAttribute("generate rage on heal", 0) > 0) { local rageMeter = NetProps.GetPropFloat(receiver, "m_Shared.m_flRageMeter") local newRageMeter = rageMeter + rageBoost < 100 ? rageMeter + rageBoost : 100 NetProps.SetPropFloat(receiver, "m_Shared.m_flRageMeter", newRageMeter) } } OnGameEvent_player_death = function(params) { local player = GetPlayerFromUserID(params.userid) if(!IsPlayerABot(player)) { return } local attacker = GetPlayerFromUserID(params.attacker) // ClientPrint(null, 3, "yeet") for (local i = 0; i < MAX_WEAPONS_HARV; i++) { local weapon = NetProps.GetPropEntityArray(attacker, "m_hMyWeapons", i) if (weapon == null) continue // ClientPrint(null, 3, "yeet2") if (params.weapon != "prinny_machete" || weapon.GetAttribute("killstreak tier", 0) != 6) continue // ClientPrint(null,3,"HARVESTER KILL") // ClientPrint(null,3,"Bot hp: " + player.GetMaxHealth()) // ClientPrint(null,3,"Is giant: " + player.HasBotAttribute(32768)) local bot_health = player.GetMaxHealth() local bot_giant = player.HasBotAttribute(32768) if(bot_health <= 150 && !bot_giant) { rewardHarvester(attacker, 0.5, true, 0.5, true, 3, 0.3, false, 0, player) } else if(bot_health > 150 && bot_health < 200 && !bot_giant) { rewardHarvester(attacker, 0.6, true, 0.6, true, 3.5, 0.35, false, 0, player) } else if(bot_health >= 200 && bot_health < 300 && !bot_giant) { rewardHarvester(attacker, 0.65, true, 0.65, true, 3.75, 0.4, false, 0, player) } else if(bot_health >= 300 && bot_health < 500 && !bot_giant) { rewardHarvester(attacker, 0.7, true, 0.7, true, 4.25, 0.45, false, 0, player) } else if(bot_health >= 500 && !bot_giant) { rewardHarvester(attacker, 1, false, 1, false, 6.5, 0.8, false, 0, player) } else if(bot_health < 3000 && bot_giant) { rewardHarvester(attacker, 2.5, false, 3, false, 8, 1, true, 2.5, player) } else if(bot_health >= 3000 && bot_health < 6000 && bot_giant) { rewardHarvester(attacker, 4, false, 6, false, 11, 1, true, 3.5, player) } else if(bot_health >= 6000 && bot_giant) { rewardHarvester(attacker, 10, false, 10, false, 18, 1, true, 5, player) } } } } HarvesterWeaponCallbacks.missionName <- NetProps.GetPropString(Entities.FindByClassname(null, "tf_objective_resource"), "m_iszMvMPopfileName") __CollectGameEventCallbacks(HarvesterWeaponCallbacks)