function SWEP:SavePreset(filename)
    if LocalPlayer() != self:GetOwner() then return end

    filename = filename or "autosave"

    local str = ""
    for i, k in pairs(self.Attachments) do
        if k.Installed then
            str = str .. k.Installed
        end

        str = str .. "\n"
    end

    filename = TacRP.PresetPath .. self:GetClass() .. "/" .. filename .. ".txt"

    file.CreateDir(TacRP.PresetPath .. self:GetClass())
    file.Write(filename, str)
end

function SWEP:LoadPreset(filename)
    if LocalPlayer() != self:GetOwner() then return end

    filename = TacRP.PresetPath .. self:GetClass() .. "/" .. "autosave" .. ".txt"

    if !file.Exists(filename, "DATA") then return end

    local f = file.Open(filename, "r", "DATA")
    if !f then return end

    local presetTbl = {}

    for i = 1, table.Count(self.Attachments) do
        local line = f:ReadLine()
        if !line then continue end
        presetTbl[i] = string.Trim(line, "\n")
    end

    local anyinstalled = false

    for i = 1, table.Count(self.Attachments) do
        if !self.Attachments[i] then continue end

        local att = presetTbl[i]
        if att == "" then
            self.Attachments[i].Installed = nil
            continue
        end


        if att == self.Attachments[i].Installed then continue end
        if !TacRP.GetAttTable(att) then continue end

        self.Attachments[i].Installed = att

        anyinstalled = true
    end

    f:Close()

    if !anyinstalled then return end

    net.Start("TacRP_receivepreset")
    net.WriteEntity(self)
    for i, k in pairs(self.Attachments) do
        if !k.Installed then
            net.WriteUInt(0, TacRP.Attachments_Bits)
        else
            local atttbl = TacRP.GetAttTable(k.Installed)
            net.WriteUInt(atttbl.ID or 0, TacRP.Attachments_Bits)
        end
    end
    net.SendToServer()

    self:SetupModel(false)
    self:SetupModel(true)

    self:InvalidateCache()

    self:SetBaseSettings()
end
