Accessible files

Here you can find all the files which can be edite to make the asset compatible with your server.​

config.lua
Config = {
    Core = 'ESX',  -- ESX / QBCORE | Other core setting on the 'core' folder and the client and server utils.lua
    Target = 'default', -- 'default' / 'oxtarget' / 'qb-target'
    BrutalNotify = true, -- Buy here: (4€+VAT) https://store.brutalscripts.com | Or set up your own notify >> cl_utils.lua
    LocallyInvisible = true, -- true or false | If your ANTICHEAT ban the player with 'Invisible' reason, set to false!
    SkinningKnifes = {'WEAPON_KNIFE', 'WEAPON_SWITCHBLADE', 'WEAPON_DAGGER'}, -- Weapon that must be in the player's hand during the loot
    HunterSwitchCommand = 'hunterswitch', -- Command to player switch between the hunter types | Legal / Illegal
    WeaponAnimation = true, -- If your server has preemption/unload weapon animation, set this to true.
    TimeFormat = '%d/%m/%Y',

    HunterLicence = {Use = true, Command = 'hlicence'}, -- Hunter licence card open command
    UndoHunterLicence = {Use = true, Command = 'uhl', CopJobs ={'police', 'sheriff'}}, -- For cops to undo player hunter licence
    
    Hunter = {
        Model = 'cs_hunter', -- Hunter npc model
        Coords = vector4(471.2939, 2607.4661, 44.4772, 7.8951), -- Hunter npc coords
        CarSpawn = vector4(462.9324, 2607.1968, 43.2730, 359.6967), -- Car spawn place
        CarModel = "sadler", -- We used this vehicle in the video: https://www.gta5-mods.com/vehicles/jeep-wrangler-unlimited-jk-2013-add-on-tuning
        CarDepositAmount = 1000, -- Car deposit money amount (0 = off)
        Blip = {use = true, label = 'Hunter', size = 1.0, sprite = 141, color = 44},
        CarBlip = {use = true, label = 'Hunter Car', size = 0.7, sprite = 227, color = 24},
    },

    HuntingAreas = {
        [1] = {
            Coords = vector4(-574.0483, 4899.7842, 170.6186, 229.7645),
            Animals = {
                vector3(-407.8195, 4966.6255, 176.2681),
                vector3(-600.4664, 5068.8169, 135.6393),
                vector3(-682.3632, 4985.8433, 175.9928),
                vector3(-665.5093, 4839.5254, 209.6504),
                vector3(-526.8015, 4876.8916, 170.3767),
                vector3(-595.7777, 4833.8965, 189.3171),
                vector3(-608.4785, 4983.2363, 141.0815),
                vector3(-628.8176, 5096.6523, 130.8865),
                vector3(-597.4748, 4864.7163, 187.7305),
            },
            Radius = 300.0,
            ZoneBlip = {use = true, color = 68, label = 'Hunting Zone', size = 0.8, sprite = 141 },
            RadiusBlip = {use = true, color = 47, alpha = 200},
            AnimalBlip = {use = true, color = 0, size = 0.65, sprite = 128},
        },
        -- You can add more...
    },

    Animals = {
        -- Legal Animals
        [1] = {
            Model = "a_c_rabbit_01", 
            Label = "Rabbit",
            Type = 'legal',
            XP = 1, 
            Items = {
                {item = "leather", label = 'Leather', amount = {min = 1, max = 2}, chance = {['bad'] = 40, ['good'] = 60, ['perfect'] = 80}},
                {item = "meat", label = 'Meat', amount = {min = 1, max = 2}, chance = {['bad'] = 40, ['good'] = 60, ['perfect'] = 80}},
            }
        },
        [2] = {
            Model = "a_c_chickenhawk", 
            Label = "Chicken Hawk",
            Type = 'legal',
            XP = 1, 
            Items = {
                {item = "feather", label = 'Feather', amount = {min = 1, max = 2}, chance = {['bad'] = 40, ['good'] = 60, ['perfect'] = 80}},
                {item = "meat", label = 'Meat', amount = {min = 1, max = 2}, chance = {['bad'] = 40, ['good'] = 60, ['perfect'] = 80}},
            }
        },
        [3] = {
            Model = "a_c_cormorant", 
            Label = "Cormorant",
            Type = 'legal',
            XP = 1, 
            Items = {
                {item = "feather", label = 'Feather', amount = {min = 1, max = 3}, chance = {['bad'] = 40, ['good'] = 60, ['perfect'] = 80}},
                {item = "meat", label = 'Meat', amount = {min = 2, max = 3}, chance = {['bad'] = 40, ['good'] = 60, ['perfect'] = 80}},
            }
        },
        [4] = {
            Model = "a_c_boar", 
            Label = "Wild boar",
            Type = 'legal',
            XP = 2, 
            Items = {
                {item = "leather", label = 'Leather', amount = {min = 2, max = 4}, chance = {['bad'] = 40, ['good'] = 60, ['perfect'] = 80}},
                {item = "meat", label = 'Meat', amount = {min = 3, max = 5}, chance = {['bad'] = 40, ['good'] = 60, ['perfect'] = 80}},
            }
        },

        -- Illegal Animals
        [5] = {
            Model = "a_c_coyote", 
            Label = "Coyote", 
            Type = 'illegal',
            XP = 2,
            Items = {
                {item = "coyote_leather", label = 'Coyote Leather', amount = {min = 2, max = 4}, chance = {['bad'] = 40, ['good'] = 60, ['perfect'] = 80}},
                {item = "meat", label = 'Meat', amount = {min = 2, max = 4}, chance = {['bad'] = 40, ['good'] = 60, ['perfect'] = 80}},
            }
        },
        [6] = {
            Model = "a_c_panther", 
            Label = "Panther", 
            Type = 'illegal',
            XP = 4,
            Items = {
                {item = "panther_leather", label = 'Panther Leather', amount = {min = 2, max = 4}, chance = {['bad'] = 40, ['good'] = 60, ['perfect'] = 80}},
                {item = "meat", label = 'Meat', amount = {min = 2, max = 4}, chance = {['bad'] = 40, ['good'] = 60, ['perfect'] = 80}},
            }
        },
        [7] = {
            Model = "a_c_deer", 
            Label = "Wild deer", 
            Type = 'illegal',
            XP = 3,
            Items = {
                {item = "leather", label = 'Leather', amount = {min = 3, max = 6}, chance = {['bad'] = 40, ['good'] = 60, ['perfect'] = 80}},
                {item = "meat", label = 'Meat', amount = {min = 3, max = 6}, chance = {['bad'] = 40, ['good'] = 60, ['perfect'] = 80}},
                {item = "antler", label = 'Antler', amount = {min = 1, max = 1}, chance = {['bad'] = 40, ['good'] = 60, ['perfect'] = 80}},
            }
        },
        -- You can add more...
    },
    
    LevelSystem = {
        [1] = {
            LevelUP = 30,
            NewAnimal = {7000, 15000},
            LootTime = {8000, 12000}, 
            Animals = {1,2,3},
        },
        [2] = {
            LevelUP = 60,
            NewAnimal = {6000, 13000},
            LootTime = {7000, 11000}, 
            Animals = {1,2,3,4},
        },
        [3] = {
            LevelUP = 120,
            NewAnimal = {5000, 11000},
            LootTime = {6000, 10000}, 
            Animals = {1,2,3,4,5},
        },
        [4] = {
            LevelUP = 240,
            NewAnimal = {4000, 9000},
            LootTime = {5000, 9000}, 
            Animals = {3,4,5,7},
        },
        [5] = {
            LevelUP = 0,
            NewAnimal = {3000, 8000},
            LootTime = {5000, 8000}, 
            Animals = {4,5,6,7},
        },
        -- You can add more levels with specific configuration
    },

    ShopItems = {
        -- You can't give the same Item to two different Items in the shop
        [1] = {item = 'weapon_knife', label = 'Skinning Knife', price = 100},
        [2] = {item = 'weapon_switchblade', label = 'Switchblade', price = 120},
        [3] = {item = 'weapon_pistol', label = 'Pistol', price = 1000},
        [4] = {item = 'ammo-9', label = 'Ammo 9', price = 5},
        --[5] = {item = 'weapon_sniperrifle', label = 'Hunter Sniper', price = 20000},
    },

    SellItems = {
        Legal = {
            --['ITEM'] = PRICE
            ['leather'] = 100,
            ['feather'] = 50,
            ['meat'] = 200
        },

        Illegal = {
            Model = 'a_m_m_eastsa_01', -- Illegal items seller npc model
            Coords = vector4(-288.3044, 6299.3696, 31.4922, 39.9611), -- Illegal items seller npc coords
    
            Items = {
                --['ITEM'] = PRICE
                ['antler'] = 400,
                ['panther_leather'] = 600,
                ['coyote_leather'] = 500
            }
        }
    },
    
    WeaponDamages = {
        {category = "unarmed", type = 'bad'},
        {category = "melee", type = 'bad'},
        {category = "pistol", type = 'bad'},
        {category = "subgun", type = 'good'},
        {category = "shootgun", type = 'bad'},
        {category = "rifle", type = 'good'},
        {category = "snip", type = 'perfect'}
    },

    -----------------------------------------------------------
    -----------------------| TRANSLATE |-----------------------
    -----------------------------------------------------------

    MoneyForm = '$',
    Waiting = 'Waiting...',
    
    Texts = {
        [1] = {'To open hunting menu, press ~w~[~g~E~w~]', 38}, -- 'TEXT', 'CONTROL'       Controls: https://docs.fivem.net/docs/game-references/controls/
        [2] = {'To skin the animal, press ~w~[~g~E~w~]', 38},
        [3] = {'Get out of the car and find an animal', 38},
        [4] = {'Drive to the huntingzone', 38},
        [5] = {'To sell the illegal items, press ~w~[~g~E~w~]', 38},
    },

    TargetTexts = { -- Open Text, Icon, Distance
        [1] = {'Open Hunter Menu', 'fa-solid fa-circle-exclamation', 2},
        [2] = {'Skin the Animal', 'fa-solid fa-sun', 2},
        [3] = {'Sell the illegal items', 'fa-solid fa-cart-shopping', 2},
    },
    
    Notify = { 
        [1] = {"HUNTING", "You have to do it with you skinning knife", 5000, "error"}, -- Error = notify type, "Your pet is still alive!" = Message, 5000 = time, 5000 = 5 sec
        [2] = {"HUNTING", "You got:", 6000, "success"}, -- TYPE, MESSAGE, TIME
        [3] = {"HUNTING", "The animal just has run away", 6000, "info"},
        [4] = {"HUNTING", "You have got the Hunting Licence!", 6000, "info"},
        [5] = {"HUNTING", "Your Hunting Licence has been withdrawn!", 6000, "info"},
        [6] = {"HUNTING", "You don't have Hunting Licence!", 6000, "info"},
        [7] = {"HUNTING", "The vehicle spawn place isn't clear!", 6000, "info"},
        [8] = {"HUNTING", "You already have a Hunting Licence!", 6000, "info"},
        [9] = {"HUNTING", "Get in the car and follow the instructions.", 6000, "info"},
        [10] = {"HUNTING", "You are already hunting!", 6000, "info"},
        [11] = {"HUNTING", "You are already working on getting your licence!", 6000, "info"},
        [12] = {"HUNTING", "You don't have any items!", 6000, "info"},
        [13] = {"HUNTING", "You are not a Cop!", 6000, "error"},
        [14] = {"HUNTING", "The deposit on the car has been deducted:<b>", 6000, "info"},
        [15] = {"HUNTING", "You got your deposit back:<b>", 6000, "info"},
        [16] = {"HUNTING", "You don't have enough money to pay the Deposit!<b>", 6000, "info"},
        [17] = {"HUNTING", "<br>You spent:<b>", 6000, "info"},
        [18] = {"HUNTING", "You don't have enough money!", 6000, "info"},
        [19] = {"HUNTING", "Get out of the car!", 6000, "error"},
        [20] = {"HUNTING", "You have already skinning the animal!", 6000, "error"},
        [21] = {"HUNTING", "Drop off your vehicle at the vehicle drop-off point!", 6000, "error"},
        [22] = {"HUNTING", "Successful action!", 6000, "success"},
    },
}
client-utils.lua
-- Buy here: (4€+VAT) https://store.brutalscripts.com
function notification(title, text, time, type)
    if Config.BrutalNotify then
        exports['brutal_notify']:SendAlert(title, text, time, type)
    else
        -- Put here your own notify and set the Config.BrutalNotify to false
        TriggerEvent('brutal_pets:client:DefaultNotify', text)
    end
end

RegisterNetEvent('brutal_pets:client:DefaultNotify')
AddEventHandler('brutal_pets:client:DefaultNotify', function(text)
    SetNotificationTextEntry("STRING")
    AddTextComponentString(text)
    DrawNotification(0,1)

    -- Default ESX Notify:
    --TriggerEvent('esx:showNotification', text)

    -- Default QB Notify:
    TriggerEvent('QBCore:Notify', text, 'info', 5000)
end)

function VehicleSpawnUtil(vehicle)  -- It fills the car's tank
    -- Set vehicle MAX fuel
    SetVehicleFuelLevel(vehicle, 100.0)
    DecorSetFloat(vehicle, "_FUEL_LEVEL", GetVehicleFuelLevel(vehicle))

    -- Set vehicle color
    SetVehicleExtraColours(vehicle, 0, 0)
	SetVehicleColours(vehicle, 53, 53)

    -- Set vehicle plate
    SetVehicleNumberPlateText(vehicle, 'HUNT'..math.random(0001,9999))

    -- Vehicle Keys
    if Config['Core']:upper() == 'QBCORE' then
        TriggerEvent("vehiclekeys:client:SetOwner", GetVehicleNumberPlateText(vehicle))
    end

end

function SetUnarmedWeapon()
    Citizen.CreateThread(function()
        while not Looted do
            SetCurrentPedWeapon(PlayerPedId(), GetHashKey('WEAPON_UNARMED'), true)
            Citizen.Wait(1)
        end
    end)
end

function PetDied(ped)
    local died = false
    if IsEntityDead(ped) then
        died = true
    end
    return died
end

function OpenMenuUtil()
    DisplayRadar(true)
end

function CloseMenuUtil()
    DisplayRadar(false)
end

function DrawText3D(x, y, z, text)
    SetTextScale(0.35, 0.35)
    SetTextFont(4)
    SetTextProportional(1)
    SetTextColour(255, 255, 255, 215)
    SetTextEntry("STRING")
    SetTextCentre(true)
    AddTextComponentString(text)
    SetDrawOrigin(x,y,z, 0)
    DrawText(0.0, 0.0)
    local factor = (string.len(text)) / 370
    DrawRect(0.0, 0.0+0.0125, 0.025+ factor, 0.03, 0, 0, 0, 75)
    ClearDrawOrigin()
end
server-utils.lua
-- Buy here: (4€+VAT) https://store.brutalscripts.com
function notification(source, title, text, time, type)
    if Config.BrutalNotify then
        TriggerClientEvent('brutal_notify:SendAlert', source, title, text, time, type)
    else
        TriggerClientEvent('brutal_pets:client:DefaultNotify', text)
    end
end

function PlayerNameFunction(source)
    return GetPlayerName(source)
end
client-core.lua
Core = nil
if Config['Core']:upper() == 'ESX' then
    
    local _esx_ = 'new' -- 'new' / 'old'

    if _esx_ then
        Core = exports['es_extended']:getSharedObject()
    else
        while Core == nil do
            TriggerEvent('esx:getSharedObject', function(obj) Core = obj end)
            Citizen.Wait(0)
        end
    end

    LoadedEvent = 'esx:playerLoaded'
    TSCB = Core.TriggerServerCallback

    function PlayerJobFunction()
        return Core.GetPlayerData().job.name
    end

    function GetClosestPlayerFunction()
        return Core.Game.GetClosestPlayer()
    end

elseif Config['Core']:upper() == 'QBCORE' then
    Core = exports['qb-core']:GetCoreObject()

    LoadedEvent = 'QBCore:Client:OnPlayerLoaded'
    TSCB = Core.Functions.TriggerCallback

    function PlayerJobFunction()
        return Core.Functions.GetPlayerData().job.name
    end

    function GetClosestPlayerFunction()
        return Core.Functions.GetClosestPlayer()
    end

end
server-core.lua
Core = nil

if Config['Core']:upper() == 'ESX' then
    local _esx_ = 'new' -- 'new' / 'old'
    
    if _esx_ == 'new' then
        Core = exports['es_extended']:getSharedObject()
    else
        Core = nil
        TriggerEvent('esx:getSharedObject', function(obj) Core = obj end)
        while Core == nil do
            Citizen.Wait(0)
        end
    end

    RESCB = Core.RegisterServerCallback
    GETPFI = Core.GetPlayerFromId
    RUI = Core.RegisterUsableItem

    function GetIdentifier(source)
        local xPlayer = GETPFI(source)
        return xPlayer.identifier
    end

    function GetPlayerByIdentifier(identifier)
        return Core.GetPlayerFromIdentifier(identifier)
    end

    function GetAccountMoney(source,account)
        local xPlayer = GETPFI(source)
        if account == 'bank' then
            return xPlayer.getAccount(account).money
        elseif account == 'money' then
            return xPlayer.getMoney()
        end
    end

    function AddMoneyFunction(source, account, amount)
        local xPlayer = GETPFI(source)
        if account == 'bank' then
            xPlayer.addAccountMoney('bank', amount)
        elseif account == 'money' then
            xPlayer.addMoney(amount)
        end
    end

    function RemoveAccountMoney(source, account, amount)
        local xPlayer = GETPFI(source)
        if account == 'bank' then
            xPlayer.removeAccountMoney('bank', amount)
        elseif account == 'money' then
            xPlayer.removeMoney(amount)
        end
    end

    function GetItemCount(source, item)
        local xPlayer = GETPFI(source)

        if _esx_ == 'new' then
            return xPlayer.getInventoryItem(item).count
        else
            if string.sub(item, 0, 6):lower() == 'weapon' then
                local loadoutNum, weapon = xPlayer.getWeapon(item:upper())

                if weapon then
                    return true
                else
                    return false
                end
            else
                return xPlayer.getInventoryItem(item).count
            end
        end
    end
    
    function RemoveItem(source, item, amount)
        local xPlayer = GETPFI(source)
        if _esx_ == 'new' then
            xPlayer.removeInventoryItem(item, amount)
        else
            if string.sub(item, 0, 6):lower() == 'weapon' then
                xPlayer.removeWeapon(item)
            else
                xPlayer.removeInventoryItem(item, amount)
            end
        end
    end

    function AddItem(source, item, count)
        local xPlayer = GETPFI(source)
        if _esx_ == 'new' then
            xPlayer.addInventoryItem(item, count)
        else
            if string.sub(item, 0, 6):lower() == 'weapon' then
                xPlayer.addWeapon(item, 90)
            else
                xPlayer.addInventoryItem(item, count)
            end
        end
    end

    function GetPlayerNameFunction(source)
        local name
        if Config.SteamName then
            name = GetPlayerName(source)
        else
            local xPlayer = GETPFI(source)
            name = xPlayer.getName() or 'No Data'
        end
        return name
    end

    function GetPlayerSex(source)
        local xPlayer = GETPFI(source)
        return xPlayer.get("sex")
    end

    function GetPlayerJob(source)
        local xPlayer = GETPFI(source)
        return xPlayer.job.name
    end

    function GetPlayerInfo(source)
        local xPlayer = GETPFI(source)
    
        local PlayerName = xPlayer.getName() or 'No Data'
        local BirthDate = xPlayer.get("dateofbirth")
        return PlayerName, BirthDate
    end

elseif Config['Core']:upper() == 'QBCORE' then

    Core = exports['qb-core']:GetCoreObject()
    
    RESCB = Core.Functions.CreateCallback
    GETPFI = Core.Functions.GetPlayer
    RUI = Core.Functions.CreateUseableItem

    function GetIdentifier(source)
        local xPlayer = GETPFI(source)
        return xPlayer.PlayerData.citizenid
    end

    function GetPlayerByIdentifier(identifier)
        return Core.Functions.GetPlayerByCitizenId(identifier)
    end

    function GetPlayersFunction()
        return Core.Functions.GetPlayers()
    end

    function GetAccountMoney(source, account)
        local xPlayer = GETPFI(source)
        if account == 'bank' then
            return xPlayer.PlayerData.money.bank
        elseif account == 'money' then
            return xPlayer.PlayerData.money.cash
        end
    end

    function AddMoneyFunction(source, account, amount)
        local xPlayer = GETPFI(source)
        if account == 'bank' then
            xPlayer.Functions.AddMoney('bank', amount)
        elseif account == 'money' then
            xPlayer.Functions.AddMoney('cash', amount)
        end
    end

    function GetItemCount(source, item)
        local xPlayer = GETPFI(source)
        local items = xPlayer.Functions.GetItemByName(item)
        local item_count = 0
        if items ~= nil then
            item_count = items.amount
        else
            item_count = 0
        end
        return item_count
    end

    function RemoveAccountMoney(source, account, amount)
        local xPlayer = GETPFI(source)
        if account == 'bank' then
            xPlayer.Functions.RemoveMoney('bank', amount)
        elseif account == 'money' then
            xPlayer.Functions.RemoveMoney('cash', amount)
        end
    end

    function RemoveItem(source, item, amount)
        local xPlayer = GETPFI(source)
        xPlayer.Functions.RemoveItem(item, amount)
    end

    function AddItem(source, item, count)
        local xPlayer = GETPFI(source)
        xPlayer.Functions.AddItem(item, count)
    end

    function GetPlayerNameFunction(source)
        local name
        if Config.SteamName then
            name = GetPlayerName(source)
        else
            local xPlayer = GETPFI(source)
            name = xPlayer.PlayerData.charinfo.firstname..' '..xPlayer.PlayerData.charinfo.lastname
        end
        return name
    end

    function GetPlayerSex(source)
        local xPlayer = GETPFI(source)
        local sex = xPlayer.PlayerData.charinfo.gender

        if sex == 0 then
            sex = 'm'
        else
            sex = 'f'
        end

        return sex
    end

    function GetPlayerJob(source)
        local xPlayer = GETPFI(source)
        return xPlayer.PlayerData.job.name
    end

    function GetPlayerInfo(source)
        local xPlayer = GETPFI(source)
    
        local PlayerName = xPlayer.PlayerData.charinfo.firstname..' '..xPlayer.PlayerData.charinfo.lastname
        local BirthDate = xPlayer.PlayerData.charinfo.birthdate
        return PlayerName, BirthDate
    end

end

Last updated