Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
feat(client/server): parking meter Prop Parking
  • Loading branch information
renzuzu committed Aug 18, 2021
1 parent cd9a061 commit dd3411b
Show file tree
Hide file tree
Showing 4 changed files with 215 additions and 11 deletions.
126 changes: 123 additions & 3 deletions client/client.lua
Expand Up @@ -15,6 +15,7 @@ local type = 'car'
local vehiclesdb = {}
local tid = 0
local propertygarage = false
local parkmeter = {}
Citizen.CreateThread(function()
while ESX == nil do
TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
Expand All @@ -28,7 +29,7 @@ Citizen.CreateThread(function()
end

PlayerData = ESX.GetPlayerData()
Wait(2000)
Wait(3000)
if Config.Realistic_Parking then
playerloaded = true
TriggerServerEvent('renzu_garage:GetParkedVehicles')
Expand Down Expand Up @@ -129,7 +130,13 @@ end)

local parkedvehicles = {}
RegisterNetEvent('renzu_garage:update_parked')
AddEventHandler('renzu_garage:update_parked', function(table,plate)
AddEventHandler('renzu_garage:update_parked', function(table,plate,p)
Wait(2000)
parkmeter = p
print(parkmeter)
for k,v in pairs(parkmeter) do
print(k,v)
end
parkedvehicles = table
Wait(100)
if plate ~= nil then
Expand Down Expand Up @@ -3336,4 +3343,117 @@ function Spawn_Vehicle_Forward(veh, coords)
SetEntityCoords(veh, move_coords.x, move_coords.y, move_coords.z)
else return end
Spawn_Vehicle_Forward(veh, move_coords)
end
end

meter_cars = {}
RegisterCommand('parkingmeter', function(source, args, rawCommand)
local closestparkingmeter = nil
local vehicle = GetVehiclePedIsIn(PlayerPedId())
local loc = GetEntityCoords(vehicle)
local coord = vector4(loc.x,loc.y,loc.z,GetEntityHeading(vehicle))
for k,v in pairs(Config.MeterProp) do
closestparkingmeter = GetClosestObjectOfType(loc, 7.0, GetHashKey(v), false)
if closestparkingmeter ~= 0 then break end
end
print(closestparkingmeter)
if closestparkingmeter ~= 0 then
local vehicle_prop = GetVehicleProperties(vehicle)
print(json.encode(vehicle_prop))
ESX.TriggerServerCallback("renzu_garage:parkingmeter",function(res)
if res then
veh = GetVehiclePedIsIn(PlayerPedId())
TaskLeaveVehicle(PlayerPedId(),GetVehiclePedIsIn(PlayerPedId()),1)
Wait(2000)
v = GetVehiclePedIsIn(PlayerPedId(),true)
FreezeEntityPosition(v,true)
SetEntityCollision(v,false)
ReqAndDelete(veh)
if meter_cars[vehicle_prop.plate] ~= nil then
meter_cars[vehicle_prop.plate] = nil
end
end
end,GetEntityCoords(closestparkingmeter),coord,json.encode(vehicle_prop))
print(closestparkingmeter)
end
end)

CreateThread(function()
Wait(2500)
while Config.ParkingMeter do
for k,v in pairs(parkmeter) do
local parkcoord = json.decode(v.park_coord)
local coord = GetEntityCoords(PlayerPedId())
local vehicle = json.decode(v.vehicle)
if #(coord - vector3(parkcoord.x,parkcoord.y,parkcoord.z)) < 50 then
if meter_cars[vehicle.plate] == nil then
local hash = tonumber(vehicle.model)
local count = 0
if not HasModelLoaded(hash) then
RequestModel(hash)
while not HasModelLoaded(hash) and count < 2000 do
count = count + 101
Citizen.Wait(10)
end
end
--local posZ = coord.z + 999.0
--_,posZ = GetGroundZFor_3dCoord(coord.x,coord.y+.0,coord.z,1)
meter_cars[vehicle.plate] = CreateVehicle(hash, parkcoord.x,parkcoord.y,parkcoord.z, 42.0, 0, 0)
SetEntityHeading(meter_cars[vehicle.plate], parkcoord.w)
SetVehicleProp(meter_cars[vehicle.plate], vehicle)
SetVehicleDoorsLocked(meter_cars[vehicle.plate],2)
NetworkFadeInEntity(meter_cars[vehicle.plate],1)
SetVehicleOnGroundProperly(meter_cars[vehicle.plate])
--SetEntityCoordsNoOffset(spawned_cars[park.plate],coord.x,coord.y,posZ,false,false,false)
CreateThread(function()
local count = 0
while count < 1000 do
count = count + 200
SetEntityCollision(meter_cars[vehicle.plate],true)
Wait(20)
end
FreezeEntityPosition(meter_cars[vehicle.plate], true)
SetEntityCollision(meter_cars[vehicle.plate],false)
return
end)
end
if #(coord - vector3(parkcoord.x,parkcoord.y,parkcoord.z)) < 3 and PlayerData.identifier ~= nil and PlayerData.identifier == v.identifier then
SetVehicleDoorsLocked(meter_cars[vehicle.plate],0)
while #(coord - vector3(parkcoord.x,parkcoord.y,parkcoord.z)) < 3 and meter_cars[vehicle.plate] ~= nil do
coord = GetEntityCoords(PlayerPedId())
FreezeEntityPosition(meter_cars[vehicle.plate], false)
SetEntityCollision(meter_cars[vehicle.plate],true)
if GetVehiclePedIsIn(PlayerPedId()) == meter_cars[vehicle.plate] then
ReqAndDelete(meter_cars[vehicle.plate])
TriggerServerEvent("renzu_garage:getparkmeter", vehicle.plate, 0, tonumber(vehicle.model))
Wait(100)
--spawned_cars[park.plate] = nil
local hash = tonumber(vehicle.model)
local count = 0
if not HasModelLoaded(hash) then
RequestModel(hash)
while not HasModelLoaded(hash) and count < 111 do
count = count + 1
Citizen.Wait(1)
end
end
myveh = CreateVehicle(hash, parkcoord.x,parkcoord.y,parkcoord.z, 42.0, 1, 1)
SetEntityHeading(myveh, parkcoord.w)
--FreezeEntityPosition(myveh, true)
-- SetEntityCollision(spawned_cars[park.plate],false)
FreezeEntityPosition(meter_cars[vehicle.plate], false)
SetEntityCollision(meter_cars[vehicle.plate],true)
SetVehicleProp(myveh, vehicle)
NetworkFadeInEntity(myveh,1)
TaskWarpPedIntoVehicle(PlayerPedId(), myveh, -1)
TriggerEvent('renzu_notify:Notify', 'info','Garage', 'Vehicle Unparked')
Wait(2500)
meter_cars[vehicle.plate] = nil
end
Wait(1000)
end
end
end
end
Wait(1000)
end
end)
11 changes: 9 additions & 2 deletions config.lua
Expand Up @@ -3,7 +3,7 @@ Config.Locale = "en"
Config.Mysql = 'mysql-async' -- "ghmattisql", "mysql-async"
Config.UseRayZone = false -- unrelease script https://github.com/renzuzu/renzu_rayzone
Config.UsePopUI = true -- Create a Thread for checking playercoords and Use POPUI to Trigger Event, set this to false if using rayzone. Popui is originaly built in to RayZone -- DOWNLOAD https://github.com/renzuzu/renzu_popui
Config.Quickpick = true -- if false system will create a garage shell and spawn every vehicle you preview
Config.Quickpick = false -- if false system will create a garage shell and spawn every vehicle you preview
Config.UniqueCarperGarage = false -- if false show all cars to all garage location! else if true, Vehicles Saved in Garage A cannot be take out from Garage B for example.
Config.EnableImpound = true -- enable/disable impound
Config.EnableHeliGarage = true -- enable/disable Helis
Expand Down Expand Up @@ -3648,4 +3648,11 @@ Config.Property = {
name = "Amarillo Vista 2",
coord = vector3(1315.17, -1732.63, 54.71),
},
}
}

Config.ParkingMeter = true
Config.MeterProp = {
[1] = 'prop_parknmeter_01',
[2] = 'prop_parknmeter_02',
}
Config.MeterPayment = 5000
13 changes: 12 additions & 1 deletion garage.sql
Expand Up @@ -23,7 +23,18 @@ CREATE TABLE IF NOT EXISTS `private_garage` (
`identifier` VARCHAR(64) NULL DEFAULT '' COLLATE 'utf8mb4_general_ci',
`vehicles` LONGTEXT NULL COLLATE 'utf8mb4_general_ci',
`garage` VARCHAR(64) NULL DEFAULT '' COLLATE 'utf8mb4_general_ci',
`inventory` LONGTEXT NULL DEFAULT '[]' COLLATE 'utf8mb4_general_ci',
`inventory` LONGTEXT NULL DEFAULT '[]' COLLATE 'utf8mb4_general_ci'
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;

CREATE TABLE IF NOT EXISTS `parking_meter` (
`identifier` VARCHAR(64) NULL DEFAULT '' COLLATE 'utf8mb4_general_ci',
`plate` VARCHAR(32) NULL DEFAULT '' COLLATE 'utf8mb4_general_ci',
`vehicle` LONGTEXT NULL COLLATE 'utf8mb4_general_ci',
`coord` LONGTEXT NULL DEFAULT '[]' COLLATE 'utf8mb4_general_ci',
`park_coord` LONGTEXT NULL DEFAULT '[]' COLLATE 'utf8mb4_general_ci'
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
Expand Down
76 changes: 71 additions & 5 deletions server/server.lua
@@ -1,11 +1,13 @@
ESX = nil
local vehicles = {}
local parkedvehicles = {}
local parkmeter = {}
TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
Citizen.CreateThread(function()
Wait(1000)
vehicles = MysqlGarage(Config.Mysql,'fetchAll','SELECT * FROM vehicles', {})
parkedvehicles = MysqlGarage(Config.Mysql,'fetchAll','SELECT * FROM owned_vehicles WHERE isparked = 1', {}) or {}
parkmeter = MysqlGarage(Config.Mysql,'fetchAll','SELECT * FROM parking_meter', {}) or {}
Wait(100)
if Config.UseRayZone then
local garages = {} -- garage table
Expand Down Expand Up @@ -522,6 +524,69 @@ RegisterCommand(Config.GiveAccessCommand, function(source, args, rawCommand)
end
end)

ESX.RegisterServerCallback('renzu_garage:parkingmeter', function (source, cb, coord, coord2,prop)
local src = source
local xPlayer = ESX.GetPlayerFromId(src)
local identifier = xPlayer.identifier
local coord = coord
local coord2 = coord2
local prop = prop
if xPlayer.getMoney() >= Config.MeterPayment then
local canpark = true
local result = MysqlGarage(Config.Mysql,'fetchAll','SELECT coord FROM parking_meter', {})
if result then
for k,v in pairs(result) do
local c = json.decode(v.coord)
if v.coord ~= nil and #(vector3(c.x,c.y,c.z) - coord) < 7 then
canpark = false
end
end
end
if canpark then
MysqlGarage(Config.Mysql,'execute','INSERT INTO parking_meter (identifier, coord, park_coord, vehicle, plate) VALUES (@identifier, @coord, @park_coord, @vehicle, @plate)', {
['@identifier'] = xPlayer.identifier,
['@coord'] = json.encode(coord),
['@park_coord'] = json.encode(coord2),
['@vehicle'] = prop,
['@plate'] = json.decode(prop).plate
})
xPlayer.removeMoney(Config.MeterPayment)
TriggerClientEvent('renzu_notify:Notify', src, 'success','Garage', 'You Successfully Park the vehicle')
Wait(300)
parkmeter = MysqlGarage(Config.Mysql,'fetchAll','SELECT * FROM parking_meter', {}) or {}
Wait(200)
TriggerClientEvent('renzu_garage:update_parked',-1,parkedvehicles,json.decode(prop).plate,parkmeter)
cb(true)
else
TriggerClientEvent('renzu_notify:Notify', src, 'error','Garage', 'Parking is occupied')
cb(false)
end
end
end)

RegisterServerEvent('renzu_garage:getparkmeter')
AddEventHandler('renzu_garage:getparkmeter', function(plate,state,model)
if not Config.PlateSpace then
plate = string.gsub(tostring(plate), '^%s*(.-)%s*$', '%1'):upper()
else
plate = string.gsub(tostring(plate), '^%s*(.-)%s*$', '%1'):upper()
end
local source = source
local xPlayer = ESX.GetPlayerFromId(source)
if xPlayer then
local result = MysqlGarage(Config.Mysql,'fetchAll','SELECT * FROM parking_meter WHERE TRIM(UPPER(plate)) = @plate', {['@plate'] = plate})
if #result > 0 then
MysqlGarage(Config.Mysql,'execute','DELETE FROM parking_meter WHERE TRIM(UPPER(plate)) = @plate', {['@plate'] = plate})
Wait(300)
parkmeter = MysqlGarage(Config.Mysql,'fetchAll','SELECT * FROM parking_meter', {}) or {}
Wait(200)
TriggerClientEvent('renzu_garage:update_parked',-1,parkedvehicles,plate:upper(),parkmeter)
else
xPlayer.showNotification("This Vehicle is not your property", 1, 0)
end
end
end)

ESX.RegisterServerCallback('renzu_garage:isvehicleingarage', function (source, cb, plate, id, ispolice)
local source = source
local xPlayer = ESX.GetPlayerFromId(source)
Expand Down Expand Up @@ -555,7 +620,8 @@ end)

RegisterServerEvent('renzu_garage:GetParkedVehicles')
AddEventHandler('renzu_garage:GetParkedVehicles', function()
TriggerClientEvent('renzu_garage:update_parked',source,parkedvehicles)
print("sending")
TriggerClientEvent('renzu_garage:update_parked',source,parkedvehicles, false, parkmeter)
end)

RegisterServerEvent('renzu_garage:park')
Expand Down Expand Up @@ -588,7 +654,7 @@ AddEventHandler('renzu_garage:park', function(plate,state,coord,model,props)
Wait(800)
parkedvehicles = MysqlGarage(Config.Mysql,'fetchAll','SELECT * FROM owned_vehicles WHERE isparked = 1', {}) or {}
Wait(200)
TriggerClientEvent('renzu_garage:update_parked',-1,parkedvehicles)
TriggerClientEvent('renzu_garage:update_parked',-1,parkedvehicles, false, parkmeter)
else
print('exploiting')
end
Expand Down Expand Up @@ -628,7 +694,7 @@ AddEventHandler('renzu_garage:unpark', function(plate,state,model)
Wait(300)
parkedvehicles = MysqlGarage(Config.Mysql,'fetchAll','SELECT * FROM owned_vehicles WHERE isparked = 1', {}) or {}
Wait(200)
TriggerClientEvent('renzu_garage:update_parked',-1,parkedvehicles,plate:upper())
TriggerClientEvent('renzu_garage:update_parked',-1,parkedvehicles,plate:upper(),parkmeter)
else
print('exploiting')
end
Expand Down Expand Up @@ -675,7 +741,7 @@ AddEventHandler('renzu_garage:changestate', function(plate,state,garage_id,model
Wait(300)
parkedvehicles = MysqlGarage(Config.Mysql,'fetchAll','SELECT * FROM owned_vehicles WHERE isparked = 1', {}) or {}
Wait(200)
TriggerClientEvent('renzu_garage:update_parked',-1,parkedvehicles,plate:upper())
TriggerClientEvent('renzu_garage:update_parked',-1,parkedvehicles,plate:upper(),parkmeter)
end
if state == 1 then
TriggerClientEvent('renzu_notify:Notify', source, 'success','Garage', 'You Successfully Store the vehicle')
Expand Down Expand Up @@ -718,7 +784,7 @@ AddEventHandler('renzu_garage:changestate', function(plate,state,garage_id,model
Wait(300)
parkedvehicles = MysqlGarage(Config.Mysql,'fetchAll','SELECT * FROM owned_vehicles WHERE isparked = 1', {}) or {}
Wait(200)
TriggerClientEvent('renzu_garage:update_parked',-1,parkedvehicles,plate:upper())
TriggerClientEvent('renzu_garage:update_parked',-1,parkedvehicles,plate:upper(),parkmeter)
end
TriggerClientEvent('renzu_notify:Notify', source, 'success','Garage', 'You Take out the Vehicle')
else
Expand Down

0 comments on commit dd3411b

Please sign in to comment.