Skip to content

Commit

Permalink
Implement rental returns and return reimbursement
Browse files Browse the repository at this point in the history
  • Loading branch information
Giana committed Jan 28, 2023
1 parent 0c7fd20 commit 7545575
Show file tree
Hide file tree
Showing 4 changed files with 122 additions and 16 deletions.
69 changes: 64 additions & 5 deletions client/main.lua
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,28 @@ local function getDisplayHeaderMenu()
return headerMenu
end

local function getReturnConfirmationMenu()
local menu = {
{
header = Lang:t('menu.return_confirm'),
isMenuHeader = true
},
{
header = Lang:t('menu.no_back'),
params = {
event = 'qb-menu:client:closeMenu'
}
},
{
header = Lang:t('menu.yes_please'),
params = {
event = 'qb-bikerental:client:returnBike'
}
}
}
return menu
end

local function setClosestDisplay()
local pos = GetEntityCoords(PlayerPedId(), true)
local current = nil
Expand Down Expand Up @@ -81,7 +103,13 @@ local function createVehicleDisplayZones()
if isPointInside then
setClosestDisplay()
if Config.WalkUpRentalMenu then
local menu = getDisplayHeaderMenu()
local ped = PlayerPedId()
local menu = nil
if IsPedInAnyVehicle(ped, false) and IsThisModelABicycle(GetEntityModel(GetVehiclePedIsIn(ped, false))) then
menu = getReturnConfirmationMenu()
else
menu = getDisplayHeaderMenu()
end
exports['qb-menu']:openMenu(menu)
end
else
Expand Down Expand Up @@ -205,13 +233,36 @@ RegisterNetEvent('qb-bikerental:client:RentBike', function(data)
TaskWarpPedIntoVehicle(PlayerPedId(), ent, -1)
SetEntityAsMissionEntity(ent, true, true)
TriggerEvent('vehiclekeys:client:SetOwner', GetVehicleNumberPlateText(ent))
TriggerServerEvent('qb-bikerental:server:recordRentedBike', GetVehicleNumberPlateText(ent))
end)
else
QBCore.Functions.Notify(Lang:t('error.not_enough_money'))
end
end, cost)
end)

RegisterNetEvent('qb-bikerental:client:openBikeReturnConfirmationMenu', function()
local menu = getReturnConfirmationMenu()
exports['qb-menu']:openMenu(menu)
end)

RegisterNetEvent('qb-bikerental:client:returnBike', function()
local ped = PlayerPedId()
local vehicle = GetVehiclePedIsIn(ped, false)
QBCore.Functions.TriggerCallback('qb-bikerental:server:CanReturnBike', function(can)
if can then
DeleteVehicle(vehicle)
Citizen.Wait(250)
if IsPedInAnyVehicle(ped) then
DeleteVehicle(vehicle)
end
QBCore.Functions.Notify(Lang:t('success.thanks_return'))
else
QBCore.Functions.Notify(Lang:t('error.cannot_return'))
end
end, GetDisplayNameFromVehicleModel(GetEntityModel(vehicle)), GetVehicleNumberPlateText(vehicle))
end)

-- Threads --

-- Display bikes + zone & blip config
Expand Down Expand Up @@ -252,10 +303,18 @@ Citizen.CreateThread(function()
if dist < 12 then
DrawMarker(2, v.rental_coords.x, v.rental_coords.y, v.rental_coords.z + 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2, 0.2, 0.1, 109, 255, 0, 0.64, 0, 0, 0, 1, 0, 0, 0)
if not Config.WalkUpRentalMenu and dist < 2 then
DrawText3Ds(v.rental_coords.x, v.rental_coords.y, v.rental_coords.z + 0.9, Lang:t('button.view_bicycles'))
if IsControlJustPressed(0, 38) then
setClosestDisplay()
TriggerEvent('qb-bikerental:client:openBikeMenu')
if IsPedInAnyVehicle(ped, false) and IsThisModelABicycle(GetEntityModel(GetVehiclePedIsIn(ped, false))) then
DrawText3Ds(v.rental_coords.x, v.rental_coords.y, v.rental_coords.z + 0.9, Lang:t('button.return_bicycle'))
if IsControlJustPressed(0, 38) then
setClosestDisplay()
TriggerEvent('qb-bikerental:client:openBikeReturnConfirmationMenu')
end
else
DrawText3Ds(v.rental_coords.x, v.rental_coords.y, v.rental_coords.z + 0.9, Lang:t('button.view_bicycles'))
if IsControlJustPressed(0, 38) then
setClosestDisplay()
TriggerEvent('qb-bikerental:client:openBikeMenu')
end
end
end
inRange = true
Expand Down
15 changes: 8 additions & 7 deletions config.lua
Original file line number Diff line number Diff line change
Expand Up @@ -147,15 +147,16 @@ Config.RentalLocations = {
- model: The bike model
- label: The name of the bike as is displayed to the player
- rental_cost: The cost to rent this bike
- return_reimbursement: The amount of money they player gets if they return the bike
- available: If the bike is available for rent
- Set to false to remove this bike from available rentals
]]
Config.Bikes = {
[1] = { model = 'bmx', label = 'BMX', rental_cost = 12, available = true },
[2] = { model = 'cruiser', label = 'Cruiser', rental_cost = 10, available = true },
[3] = { model = 'fixter', label = 'Fixter', rental_cost = 20, available = true },
[4] = { model = 'scorcher', label = 'Scorcher', rental_cost = 15, available = true },
[5] = { model = 'tribike', label = 'Tribike', rental_cost = 22, available = true },
[6] = { model = 'tribike2', label = 'Tribike 2', rental_cost = 22, available = true },
[7] = { model = 'tribike3', label = 'Tribike 3', rental_cost = 22, available = true },
[1] = { model = 'bmx', label = 'BMX', rental_cost = 12, return_reimbursement = 2, available = true },
[2] = { model = 'cruiser', label = 'Cruiser', rental_cost = 10, return_reimbursement = 1, available = true },
[3] = { model = 'fixter', label = 'Fixter', rental_cost = 20, return_reimbursement = 4, available = true },
[4] = { model = 'scorcher', label = 'Scorcher', rental_cost = 15, return_reimbursement = 3, available = true },
[5] = { model = 'tribike', label = 'Tribike', rental_cost = 22, return_reimbursement = 5, available = true },
[6] = { model = 'tribike2', label = 'Tribike 2', rental_cost = 22, return_reimbursement = 5, available = true },
[7] = { model = 'tribike3', label = 'Tribike 3', rental_cost = 22, return_reimbursement = 5, available = true },
}
16 changes: 12 additions & 4 deletions locales/en.lua
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
local Translations = {
error = {
not_enough_money = 'You do not have enough money!'
not_enough_money = 'You do not have enough money!',
cannot_return = 'You cannot return this...',
not_found_model = 'Error: Model not found'
},
success = {
thanks_return = 'Thanks for returning the rental!'
},
menu = {
view_bicycles = 'View bicycles for rent',
Expand All @@ -9,14 +14,17 @@ local Translations = {
cancel = 'Cancel',
rent_confirm = 'Is this the bicycle you want to rent?',
no_back = 'No, take me back!',
yes_please = 'Yes, please!'
yes_please = 'Yes, please!',
return_confirm = 'Do you want to return this bicycle?',
},
button = {
view_bicycles = '~g~E~w~ - View Bicycles for Rent'
view_bicycles = '~g~E~w~ - View Bicycles for Rent',
return_bicycle = '~g~E~w~ - Return Bicycle'
},
other = {
plate_text = 'RENT ME',
purchase_desc = 'Bike rental'
purchase_desc = 'Bike rental',
return_desc = 'Bike return'
}
}

Expand Down
38 changes: 38 additions & 0 deletions server/main.lua
Original file line number Diff line number Diff line change
@@ -1,5 +1,26 @@
local QBCore = exports['qb-core']:GetCoreObject()

local RentedBikes = {}

-- Functions --

function recordReturnedBike(plate)
RentedBikes[plate] = nil
end

function reimbursePlayer(source, modelName)
local player = QBCore.Functions.GetPlayer(source)
for k, v in pairs(Config.Bikes) do
if v.model == modelName:lower() then
if v.return_reimbursement > 0 then
player.Functions.AddMoney('cash', v.return_reimbursement, Lang:t('other.return_desc'))
end
return
end
end
TriggerClientEvent('QBCore:Notify', source, Lang:t('error.not_found_model'), 'error')
end

-- Events --

RegisterNetEvent('qb-bikerental:server:swapVehicle', function(data)
Expand All @@ -9,6 +30,10 @@ RegisterNetEvent('qb-bikerental:server:swapVehicle', function(data)
TriggerClientEvent('qb-bikerental:client:openBikeRentalConfirmationMenu', src, data)
end)

RegisterNetEvent('qb-bikerental:server:recordRentedBike', function(plate)
RentedBikes[plate] = true
end)

-- Callbacks --

QBCore.Functions.CreateCallback('qb-bikerental:server:CanRentBike', function(source, cb, rentalCost)
Expand All @@ -22,4 +47,17 @@ QBCore.Functions.CreateCallback('qb-bikerental:server:CanRentBike', function(sou
else
cb(false)
end
end)

QBCore.Functions.CreateCallback('qb-bikerental:server:CanReturnBike', function(source, cb, modelName, plate)
if plate == nil then
cb(false)
end
if RentedBikes[plate] ~= nil then
reimbursePlayer(source, modelName)
recordReturnedBike(plate)
cb(true)
else
cb(false)
end
end)

0 comments on commit 7545575

Please sign in to comment.