Scripts/resources/[qb]/[qb_extras]/qb-gym/client/gym.lua

366 lines
10 KiB
Lua
Raw Permalink Normal View History

2024-12-29 20:07:50 +00:00
local QBCore = exports['qb-core']:GetCoreObject()
local training = false
local resting = false
local membership = false
local gotTicket = false
local minutes = 0
local seconds = 0
RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function()
Citizen.CreateThread(function()
FetchSkills()
if Config.DeleteStats == true then
while true do
local seconds = Config.UpdateFrequency * 1000
Wait(seconds)
for skill, value in pairs(Config.Skills) do
UpdateSkill(skill, value["RemoveAmount"])
end
TriggerServerEvent("qb-skills:update", json.encode(Config.Skills))
end
end
end)
end)
local function round(num)
return math.floor(num+.5)
end
function RefreshSkills()
for type, value in pairs(Config.Skills) do
if value["Stat"] then
StatSetInt(value["Stat"], round(value["Current"]), true)
end
end
end
function FetchSkills()
QBCore.Functions.TriggerCallback("qb-skills:fetchStatus", function(data)
if data then
for status, value in pairs(data) do
if Config.Skills[status] then
Config.Skills[status]["Current"] = value["Current"]
else
-- print("Removing: " .. status)
end
end
end
RefreshSkills()
end)
end
function UpdateSkill(skill, amount)
if not Config.Skills[skill] then
-- print("Skill " .. skill .. " doesn't exist")
return
end
local SkillAmount = Config.Skills[skill]["Current"]
if SkillAmount + tonumber(amount) < 0 then
Config.Skills[skill]["Current"] = 0
elseif SkillAmount + tonumber(amount) > 100 then
Config.Skills[skill]["Current"] = 100
else
Config.Skills[skill]["Current"] = SkillAmount + tonumber(amount)
end
RefreshSkills()
if tonumber(amount) > 0 then
QBCore.Functions.Notify( Config.Skills[skill]["Local"] .. ': + ' .. amount ..'%', 'success')
end
TriggerServerEvent("qb-skills:update", json.encode(Config.Skills))
end
local function CheckTraining()
if resting == true then
QBCore.Functions.Notify('Du hviler', 'primary')
resting = false
Wait(15000)
training = false
end
if resting == false then
QBCore.Functions.Notify('Du kan nu træne igen!', 'success')
end
end
function buyMember()
TriggerServerEvent('qb-gym:buyMembership')
closeMenuFull()
end
function hasPlayerRunOutOfTime()
return (minutes == 0 and seconds <= 1)
end
function playerBuyTicketMenu()
exports['qb-menu']:openMenu({
{
header = "Fitness træner",
isMenuHeader = true,
},
{
header = "Fitness medlemskab 250,-",
txt = "Køb",
params = {
event = "qb-gym:client:buyTicket",
args = '1'
}
},
{
header = "Luk",
txt = "",
params = {
event = ""
}
},
})
end
function returnTicketMenu()
exports['qb-menu']:openMenu({
{
header = "Fitness træner",
isMenuHeader = true,
},
{
header = "Stop medlemskab",
txt = "Opsig dit medlemskab",
params = {
event = "qb-gym:client:returnTicket",
}
},
{
header = "Luk",
txt = "",
params = {
event = ""
}
},
})
end
--------------------------------------------------------------------------------------------------------------------
function doesPlayerHaveTicket()
return gotTicket
end
function countTime()
seconds = seconds - 1
if seconds == 0 then
seconds = 59
minutes = minutes - 1
end
if minutes == -1 then
minutes = 0
seconds = 0
end
end
function displayTime()
TriggerEvent('cd_drawtextui:ShowUI', 'show', "Tid tilbage på medlemskab</br> "..minutes..":"..seconds)
end
RegisterNetEvent("qb-gym:client:openTicketMenu")
AddEventHandler("qb-gym:client:openTicketMenu", function()
if gotTicket == false then
playerBuyTicketMenu()
else
returnTicketMenu()
end
end)
RegisterNetEvent('qb-gym:client:buyTicket')
AddEventHandler('qb-gym:client:buyTicket', function(args)
local args = tonumber(args)
if args == 1 then
TriggerServerEvent("qb-gym:server:buyTicket", 'fitness_subscription')
else
TriggerServerEvent("qb-gym:server:buyTicket", 'fitness_subscription')
end
end)
RegisterNetEvent("qb-gym:clientticketResult")
AddEventHandler("qb-gym:clientticketResult", function(ticket)
seconds = 1
minutes = Config.ticketPrice[ticket].time
gotTicket = true
QBCore.Functions.Notify("Medlemskabs tid: "..Config.ticketPrice[ticket].time.." minutter", "primary")
end)
RegisterNetEvent('qb-gym:client:returnTicket')
AddEventHandler('qb-gym:client:returnTicket', function()
minutes = 0
seconds = 0
gotTicket = false
QBCore.Functions.Notify("Dit medlemskort er ikke aktivt mere", "primary")
TriggerEvent('cd_drawtextui:HideUI')
end)
local 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)
ClearDrawOrigin()
end
--count time
CreateThread(function()
while true do
Wait(1000)
if gotTicket then
if hasPlayerRunOutOfTime() then
QBCore.Functions.Notify("Dit medlemskab er udløbet", "error", 5000)
gotTicket = false
SendNUIMessage({
type = "off",
game = "",
})
SetNuiFocus(false, false)
end
countTime()
displayTime()
if gotTicket == false then
TriggerEvent('cd_drawtextui:HideUI')
end
end
end
end)
CreateThread(function()
blip = AddBlipForCoord(Config.GymBlip)
SetBlipSprite(blip, 311)
SetBlipDisplay(blip, 4)
SetBlipScale(blip, 0.8)
SetBlipColour(blip, 7)
SetBlipAsShortRange(blip, true)
BeginTextCommandSetBlipName("STRING")
AddTextComponentString('Fitness rum')
EndTextCommandSetBlipName(blip)
end)
RegisterNetEvent('qb-gym:trueMembership', function()
membership = true
end)
RegisterNetEvent('qb-gym:falseMembership', function()
membership = false
end)
CreateThread(function()
while true do
sleep = 1000
local ped = PlayerPedId()
local pos = GetEntityCoords(ped)
for k, v in pairs(Config.Locations) do
local dist = #(pos - vector3(Config.Locations[k].coords.x, Config.Locations[k].coords.y, Config.Locations[k].coords.z))
if dist < 1.0 then
if dist < Config.Locations[k].viewDistance then
sleep = 0
DrawText3D(Config.Locations[k].coords.x, Config.Locations[k].coords.y, Config.Locations[k].coords.z, Config.Locations[k].Text3D)
if IsControlJustReleased(0, 38) then
if gotTicket then
if training == false then
TriggerServerEvent('qb-gym:checkChip')
QBCore.Functions.Notify('Starter træning', 'success')
Wait(1000)
if membership == true then
SetEntityHeading(ped, Config.Locations[k].heading)
SetEntityCoords(ped, Config.Locations[k].coords.x, Config.Locations[k].coords.y, Config.Locations[k].coords.z - 1)
TaskStartScenarioInPlace(ped, Config.Locations[k].animation, 0, true)
Wait(20000)
for k, v in pairs(GetGamePool('CObject')) do
if IsEntityAttachedToEntity(PlayerPedId(), v) then
SetEntityAsMissionEntity(v, true, true)
DeleteObject(v)
DeleteEntity(v)
end
end
ClearPedTasksImmediately(PlayerPedId())
UpdateSkill(Config.Locations[k].skill, Config.Locations[k].SkillAddQuantity)
-- print(Config.Locations[k].skill, Config.Locations[k].SkillAddQuantity)
QBCore.Functions.Notify('Du skal hvile i 10 sekunder før du kan træne igen', 'error')
training = true
resting = true
CheckTraining()
elseif membership == false then
QBCore.Functions.Notify('Du har ikke et medlemskab', 'error')
end
elseif training == true then
QBCore.Functions.Notify('Du har brug for en pause', 'primary')
resting = true
CheckTraining()
end
else
wait = 15000
QBCore.Functions.Notify("Medlemskabet er ikke gyldigt", "error")
end
end
end
end
end
Wait(sleep)
end
end)
CreateThread(function()
while true do
Wait(1000)
for k, v in pairs(Config.PedLocations) do
local pos = GetEntityCoords(PlayerPedId())
local dist = #(pos - vector3(v.coords.x, v.coords.y, v.coords.z))
if dist < 40 and not pedspawned then
TriggerEvent('qb-gym:spawn:ped', v.coords)
pedspawned = true
end
if dist >= 35 then
pedspawned = false
DeletePed(GymPed)
end
end
end
end)
RegisterNetEvent('qb-gym:spawn:ped')
AddEventHandler('qb-gym:spawn:ped',function(coords)
local hash = `a_m_y_musclbeac_01`
RequestModel(hash)
while not HasModelLoaded(hash) do
Wait(10)
end
pedspawned = true
GymPed = CreatePed(5, hash, coords.x, coords.y, coords.z - 1.0, coords.w, false, false)
FreezeEntityPosition(GymPed, true)
SetBlockingOfNonTemporaryEvents(GymPed, true)
TaskStartScenarioInPlace(GymPed, "WORLD_HUMAN_STAND_MOBILE_UPRIGHT", 0, true)
end)
--======================================== qb-target
exports['qb-target']:AddTargetModel(`a_m_y_musclbeac_01`, {
options = {
{
event = "qb-gym:client:openTicketMenu",
icon = "fab fa-speakap",
label = "Fitness rum",
},
},
distance = 2.5
})