AddCSLuaFile()

ENT.Base                     = "tacrp_proj_base"
ENT.PrintName                = "Rock"
ENT.Spawnable                = false

ENT.Model                    = "models/props_debris/concrete_chunk05g.mdl"

ENT.IsRocket = false // projectile has a booster and will not drop.

ENT.InstantFuse = false // projectile is armed immediately after firing.
ENT.RemoteFuse = false // allow this projectile to be triggered by remote detonator.
ENT.ImpactFuse = true // projectile explodes on impact.

ENT.ExplodeOnDamage = false // projectile explodes when it takes damage.
ENT.ExplodeUnderwater = false

ENT.Delay = 0

ENT.AllowFunny = true

ENT.ExtraModels = {
    "models/props_junk/PopCan01a.mdl",
    "models/Gibs/HGIBS.mdl",
    "models/props_junk/garbage_glassbottle003a.mdl",
    "models/props_junk/garbage_glassbottle001a.mdl",
    "models/props_junk/garbage_glassbottle002a.mdl",
    "models/props_junk/garbage_metalcan001a.mdl",
    "models/props_junk/garbage_metalcan002a.mdl",
    "models/props_junk/GlassBottle01a.mdl",
    "models/props_junk/garbage_coffeemug001a.mdl",
    "models/props_junk/glassjug01.mdl",
    "models/props_lab/jar01b.mdl",
    "models/props_junk/watermelon01.mdl",
    "models/props_junk/CinderBlock01a.mdl",
    "models/props_junk/MetalBucket01a.mdl",
    "models/props_junk/metal_paintcan001a.mdl",
    "models/Gibs/Antlion_gib_Large_2.mdl",
    "models/props_junk/garbage_plasticbottle003a.mdl",
    "models/props_junk/garbage_plasticbottle002a.mdl",
    "models/props_junk/garbage_plasticbottle001a.mdl",
    "models/props_junk/terracotta01.mdl",
    "models/props_junk/Shoe001a.mdl",
    "models/props_lab/frame002a.mdl",
    "models/props_lab/reciever01c.mdl",
    "models/props_lab/box01a.mdl",
    "models/props_junk/garbage_milkcarton001a.mdl",
    "models/props_lab/cactus.mdl",
    "models/props_lab/desklamp01.mdl",
    "models/Gibs/HGIBS_spine.mdl",
    "models/Gibs/wood_gib01a.mdl",
    "models/Gibs/wood_gib01b.mdl",
    "models/Gibs/wood_gib01c.mdl",
    "models/Gibs/wood_gib01d.mdl",
    "models/Gibs/wood_gib01e.mdl",
    "models/props_c17/oildrum001_explosive.mdl", // won't actually explode :trolleg:
    "models/props_interiors/SinkKitchen01a.mdl",
    "models/props_borealis/door_wheel001a.mdl",
    "models/hunter/blocks/cube025x025x025.mdl",
    "models/food/burger.mdl",
    "models/food/hotdog.mdl",
    "models/lamps/torch.mdl",
    "models/player/items/humans/top_hat.mdl",
    "models/dav0r/camera.mdl",
    "models/dav0r/tnt/tnt.mdl",
    "models/maxofs2d/camera.mdl",
    "models/maxofs2d/companion_doll.mdl",
    "models/maxofs2d/cube_tool.mdl",
    "models/maxofs2d/light_tubular.mdl",
    "models/maxofs2d/lamp_flashlight.mdl",
    "models/mechanics/gears/gear12x12.mdl",
    "models/mechanics/various/211.mdl",
    "models/props_phx/games/chess/white_rook.mdl",
    "models/props_phx/games/chess/white_queen.mdl",
    "models/props_phx/games/chess/white_pawn.mdl",
    "models/props_phx/games/chess/white_knight.mdl",
    "models/props_phx/games/chess/white_king.mdl",
    "models/props_phx/games/chess/white_dama.mdl",
    "models/props_phx/games/chess/black_rook.mdl",
    "models/props_phx/games/chess/black_queen.mdl",
    "models/props_phx/games/chess/black_pawn.mdl",
    "models/props_phx/games/chess/black_knight.mdl",
    "models/props_phx/games/chess/black_king.mdl",
    "models/props_phx/games/chess/black_dama.mdl",
    "models/props_phx/games/chess/black_bishop.mdl",
    "models/props_phx/misc/egg.mdl",
    "models/props_phx/misc/potato.mdl",
    "models/props_phx/misc/potato_launcher_explosive.mdl",
    "models/props_phx/misc/smallcannonball.mdl",
    "models/props_phx/misc/soccerball.mdl",
    "models/props_phx/misc/fender.mdl",
    "models/props_combine/breenbust.mdl",
    "models/props_combine/breenglobe.mdl",
    "models/props_combine/combinebutton.mdl",
    "models/props_combine/breenclock.mdl",
    "models/props_interiors/pot01a.mdl",
    "models/props_junk/garbage_bag001a.mdl",
    "models/props_lab/harddrive02.mdl",
    "models/props_lab/monitor02.mdl", // HAAAAAAX
    "models/props_lab/clipboard.mdl",
    "models/props_lab/tpplug.mdl",
    "models/props_pipes/valvewheel002a.mdl",
    "models/props_pipes/valve003.mdl",
    "models/props_rooftop/sign_letter_m001.mdl",
    "models/props_rooftop/sign_letter_f001b.mdl",
    "models/props_rooftop/sign_letter_u001b.mdl",
    "models/props_wasteland/speakercluster01a.mdl",
    "models/props_wasteland/prison_toilet01.mdl",
    "models/props_c17/streetsign001c.mdl",
    "models/props_c17/streetsign002b.mdl",
    "models/props_c17/streetsign003b.mdl",
    "models/props_c17/streetsign004e.mdl",
    "models/props_c17/streetsign004f.mdl",
    "models/props_c17/streetsign005b.mdl",
    "models/props_c17/streetsign005c.mdl",
    "models/props_c17/streetsign005d.mdl",
    "models/props_c17/playgroundTick-tack-toe_block01a.mdl",
    "models/props_c17/doll01.mdl",
    "models/props_c17/BriefCase001a.mdl",
    "models/props_c17/metalPot001a.mdl",
    "models/props_c17/metalPot002a.mdl",
    "models/props_canal/mattpipe.mdl",
    "models/extras/info_speech.mdl",
    "models/items/grenadeammo.mdl", // not a live one
    "models/props_c17/light_cagelight02_on.mdl",
    "models/props_c17/suitcase_passenger_physics.mdl",
    "models/props_citizen_tech/guillotine001a_wheel01.mdl",
    "models/props_interiors/bathtub01a.mdl", // now this is just absurd
    "models/props_junk/garbage_takeoutcarton001a.mdl",
    "models/props_junk/garbage_newspaper001a.mdl",
    "models/props_junk/sawblade001a.mdl",
    "models/props_lab/bewaredog.mdl",
    "models/props_lab/huladoll.mdl",
    "models/props_lab/powerbox02d.mdl",
    "models/props_lab/powerbox02b.mdl",
    "models/props_lab/powerbox02a.mdl",
    "models/weapons/w_bugbait.mdl",
    "models/weapons/w_alyx_gun.mdl",
    "models/weapons/w_crowbar.mdl",
    "models/weapons/w_smg1.mdl",
    "models/weapons/w_shotgun.mdl",
    "models/weapons/w_rocket_launcher.mdl",
    "models/weapons/w_pistol.mdl",
    "models/weapons/w_physics.mdl",
    "models/weapons/w_irifle.mdl",
    "models/weapons/w_357.mdl",
    "models/weapons/w_package.mdl",
    "models/weapons/w_pist_deagle.mdl",
    "models/weapons/w_pist_elite_single.mdl",
    "models/weapons/w_pist_glock18.mdl",
    "models/weapons/w_rif_ak47.mdl",
    "models/weapons/w_rif_m4a1.mdl",
    "models/weapons/w_shot_m3super90.mdl",
    "models/weapons/w_smg_mp5.mdl",
    "models/weapons/w_snip_awp.mdl",
    "models/weapons/w_crossbow.mdl",
    "models/weapons/w_eq_defuser.mdl",
    "models/weapons/w_toolgun.mdl",
    "models/weapons/w_missile_closed.mdl",
    "models/weapons/w_stunbaton.mdl",
    "models/weapons/w_annabelle.mdl",
    "models/roller.mdl",
    "models/pigeon.mdl",
    "models/headcrabclassic.mdl",
    "models/headcrab.mdl",
    "models/headcrabblack.mdl",
    "models/crow.mdl",
    "models/seagull.mdl",
    "models/kleiner.mdl",
    "models/gman.mdl",
    "models/manhack.mdl",

    // CSS
    "models/props/cs_militia/bottle01.mdl",
    "models/props/cs_office/coffee_mug.mdl",
    "models/props/cs_office/computer_keyboard.mdl",
    "models/props/cs_office/water_bottle.mdl",
    "models/props/cs_office/projector_remote.mdl",
    "models/props/cs_office/phone.mdl",
    "models/props/cs_italy/bananna_bunch.mdl",
    "models/props/cs_italy/bananna.mdl",
    "models/props/cs_italy/orange.mdl",
    "models/props/de_tides/vending_turtle.mdl",
}

function ENT:Initialize()
    if SERVER then
        if util.IsValidModel(TacRP.ConVars["rock_funny"]:GetString()) then
            self:SetModel(TacRP.ConVars["rock_funny"]:GetString())
        elseif self.AllowFunny and math.random() <= TacRP.ConVars["rock_funny"]:GetFloat() then
            local i = math.min(TacRP.ConVars["rock_funny"]:GetFloat() > 1 and TacRP.ConVars["rock_funny"]:GetInt() - 1 or math.random(1, #self.ExtraModels), #self.ExtraModels)
            local mdl = self.ExtraModels[i]
            self:SetModel(util.IsValidModel(mdl) and mdl or self.Model)
        else
            self:SetModel(self.Model)
        end

        self:SetSkin(math.random(1, self:SkinCount()))

        self:PhysicsInit(SOLID_VPHYSICS)
        self:SetMoveType(MOVETYPE_VPHYSICS)
        self:SetSolid(SOLID_VPHYSICS)
        self:SetCollisionGroup(COLLISION_GROUP_PROJECTILE)
        if self.Defusable then
            self:SetUseType(SIMPLE_USE)
        end
        self:PhysWake()

        local phys = self:GetPhysicsObject()
        if !phys:IsValid() then
            self:Remove()
        else
            phys:SetDragCoefficient(0)
            phys:SetMass(2)
        end

        if self.IsRocket then
            phys:EnableGravity(false)
        end
    end

    self.SpawnTime = CurTime()

    self.NPCDamage = IsValid(self:GetOwner()) and self:GetOwner():IsNPC() and !TacRP.ConVars["npc_equality"]:GetBool()

    if self.AudioLoop then
        self.LoopSound = CreateSound(self, self.AudioLoop)
        self.LoopSound:Play()
    end

    if self.InstantFuse then
        self.ArmTime = CurTime()
        self.Armed = true
    end
end

function ENT:Impact(data, collider)
    return true
end


function ENT:PhysicsCollide(data, collider)
    local attacker = self.Attacker or self:GetOwner() or self

    if IsValid(data.HitEntity) and data.HitEntity:GetClass() == "func_breakable_surf" then
        self:FireBullets({
            Attacker = attacker,
            Inflictor = self,
            Damage = 0,
            Distance = 32,
            Tracer = 0,
            Src = self:GetPos(),
            Dir = data.OurOldVelocity:GetNormalized(),
        })
        local pos, ang, vel = self:GetPos(), self:GetAngles(), data.OurOldVelocity
        self:SetAngles(ang)
        self:SetPos(pos)
        self:GetPhysicsObject():SetVelocityInstantaneous(vel * 0.5)
        return
    end

    local prop1 = util.GetSurfaceData(data.OurSurfaceProps)
    local prop2 = util.GetSurfaceData(data.TheirSurfaceProps)


    if IsValid(data.HitEntity) and (self.LastDamage or 0) + 0.25 < CurTime() then
        local dmg = DamageInfo()
        dmg:SetAttacker(attacker)
        dmg:SetInflictor(self)
        dmg:SetDamage(Lerp((data.OurOldVelocity:Length() - 500) / 2500, 4, 35))
        if self:GetModel() != self.Model then
            dmg:ScaleDamage(2)
        end
        dmg:SetDamageType(DMG_CRUSH + DMG_CLUB)
        dmg:SetDamageForce(data.OurOldVelocity)
        dmg:SetDamagePosition(data.HitPos)
        data.HitEntity:TakeDamageInfo(dmg)
        self.LastDamage = CurTime()
        self:SetCollisionGroup(COLLISION_GROUP_WEAPON)
    elseif data.Speed >= 75 and (self.LastImpact or 0) + 0.1 < CurTime() then
        self.LastImpact = CurTime()
        self:EmitSound(self:GetModel() == self.Model and "physics/concrete/rock_impact_hard" .. math.random(1, 6) .. ".wav" or prop1.impactHardSound)
    elseif data.Speed >= 25 and (self.LastImpact or 0) + 0.1 < CurTime() then
        self.LastImpact = CurTime()
        self:EmitSound(self:GetModel() == self.Model and "physics/concrete/rock_impact_soft" .. math.random(1, 3) .. ".wav" or prop1.impactSoftSound)
    end

    if !self.FirstHit then
        self.FirstHit = true
        self:EmitSound(prop2.bulletImpactSound)

        if self:GetModel() == self.Model then
            self:EmitSound("physics/concrete/concrete_break" .. math.random(2, 3) .. ".wav", 75, math.Rand(105, 110), 0.5)
            SafeRemoveEntityDelayed(self, 3)
        else
            self:EmitSound(prop1.impactHardSound)
            if util.IsValidRagdoll(self:GetModel()) then
                local rag = ents.Create("prop_ragdoll")
                rag:SetModel(self:GetModel())
                rag:SetPos(self:GetPos())
                rag:SetAngles(self:GetAngles())
                rag:Spawn()
                rag:SetCollisionGroup(COLLISION_GROUP_WEAPON)
                if IsValid(rag:GetPhysicsObject()) then
                    rag:GetPhysicsObject():ApplyForceOffset(data.HitPos, data.OurOldVelocity)
                end

                SafeRemoveEntityDelayed(rag, 5)
                self:Remove()
            else
            local gibs = self:PrecacheGibs()
                if gibs > 0 then
                    self:GibBreakClient(data.OurNewVelocity * math.Rand(0.8, 1.2))
                    // self:GibBreakServer( data.OurOldVelocity * 2 )
                    self:Remove()
                else
                    SafeRemoveEntityDelayed(self, 3)
                end
            end
        end


    end
end
