::BulwarkThink <- function()
{
    local buttons_bulwark = NetProps.GetPropInt(self, "m_nButtons");
    local buttons_changed_bulwark = buttons_last_bulwark ^ buttons_bulwark;
    local buttons_pressed_bulwark = buttons_changed_bulwark & buttons_bulwark;
    local buttons_released_bulwark = buttons_changed_bulwark & (~buttons_bulwark);

    local getWep = PopExtUtil.GetItemInSlot(self, 1)
    local getWepPrimary = PopExtUtil.GetItemInSlot(self, 0)
    local activeWep = self.GetActiveWeapon()

    local curLocation = self.GetOrigin()
    local forwardvelo = self.EyePosition()+self.EyeAngles().Forward()*150
    local eyepos = self.EyePosition()+self.EyeAngles()
    local eyelook = self.EyeAngles()
    //printl(eyepos.y)
    ////printl(forwardvelo)

    buttonTime++
    //printl(buttonTime)
    if (buttonTime <= 250)
    {
        self.PressAltFireButton(0.1)
    }
    if (buttonTime >= 600)
    {
        buttonTime = 0
    }

    if (buttons_bulwark & Constants.FButtons.IN_ATTACK2)
    {
        if (self.InCond(51)) return
        if (shieldFire == null || !shieldFire.IsValid())
        {
            shieldFire = SpawnEntityFromTable("info_particle_system",
            {
                targetname = "fireshield"
                origin = forwardvelo,
                angles = Vector(0, eyepos.y - 80, 0),
                effect_name = "projectile_fireball_ring_fire",
                flag_as_weather = 0,
            })
        }
        if (self == null)
        {
            shieldFire.Kill()
            shieldFire = null
        }
        if (shieldFire == null) return
        getWepPrimary.AddAttribute("is_passive_weapon", 1, -1)
        //play particle + kill marked particle
        //self.SetForcedTauntCam(1);
        local goodpos = self.EyePosition()+self.EyeAngles()
        if (shieldFire.IsValid())
        {
            EntFireByHandle(shieldFire, "start", "", -1, null, null)
            shieldFire.SetOrigin(forwardvelo)
            shieldFire.SetAbsAngles(eyelook)
        }

        //DebugDrawCircle(forwardvelo, Vector(20, 155, 55), 255, 80, true, 0.1)
        for(local projectile; projectile = FindByClassnameWithin(projectile, "tf_projectile_*", forwardvelo, 45);)
        {
            //get every entity in radius
            if (projectile.GetTeam() != self.GetTeam() && projectile.GetTeam() != TEAM_SPECTATOR)
            {
                local projectileOrigin = projectile.GetOrigin()

                local explosionParticle = SpawnEntityFromTable("info_particle_system",
                {
                    targetname = "kaboom"
                    origin = projectileOrigin,
                    angles = Vector(0, 0, 0),
                    effect_name = "taunt_pyro_dosido_flame",
                    flag_as_weather = 0,
                })

                //play particle + kill marked particle
                if (explosionParticle.IsValid())
                {
                    EntFireByHandle(explosionParticle, "start", "", -1, null, null)
                    EntFireByHandle(explosionParticle, "kill", "", 2, null, null)
                }
                projectile.Kill()
                //shieldFire = null
            }
            if (projectile == null) 
            {
                //once we are done with every player stop the loop
                break
            }
        }
        self.AddCustomAttribute("move speed penalty", 0.1, -1)
        self.AddCustomAttribute("no_attack", 1, -1)
    }
    else
    {
        if (shieldFire == null) return
        self.RemoveCustomAttribute("move speed penalty")
        self.RemoveCustomAttribute("no_attack")
        getWepPrimary.RemoveAttribute("is_passive_weapon")
        if (shieldFire.IsValid())
        {
            EntFireByHandle(shieldFire, "stop", "", -1, null, null)
        }
        //shieldFire = null
        for(local effect; effect = FindByName(effect, "fireshield");)
        {
            if (effect != null)
            effect.Kill()
        }
        //shieldFire.Kill()
    }

    buttons_last_bulwark = buttons_bulwark;
}

//////////////////////////ON GAME EVENTS

::BurnwarkSetter <- function()
{
    local playerScope = self.GetScriptScope()
    if (self != null && self.IsBotOfType(TF_BOT_TYPE))
    {
        self.ValidateScriptScope();
        if (!("PlayerThinkTable" in self.GetScriptScope())) self.GetScriptScope().PlayerThinkTable <- {}
        if (self.HasBotTag("bot_bulwark"))
        {
            playerScope.buttons_last_bulwark <- 0
            playerScope.shieldFire <- null
            playerScope.buttonTime <- 0
            playerScope.PlayerThinkTable.BulwarkThink <- BulwarkThink
        }
    }
}

function OnGameEvent_post_inventory_application(params)
{
    local player = GetPlayerFromUserID(params.userid);
    local class_string = PopExtUtil.Classes[player.GetPlayerClass()]
    local playerScope = player.GetScriptScope()
    // printl(class_string)
    // printl(player)

    if (player != null && player.IsBotOfType(TF_BOT_TYPE))
    {
        EntFireByHandle(player, "CallScriptFunction", "BurnwarkSetter", 0, null, null);
    }
}

__CollectGameEventCallbacks(this);