1
0
Fork 0
forked from Simnation/Main
Main/resources/[housing]/renzu_motels/client/main.lua

980 lines
29 KiB
Lua
Raw Normal View History

2025-07-10 13:19:26 +02:00
local kvpname = GetCurrentServerEndpoint()..'_inshells'
CreateBlips = function()
for k,v in pairs(config.motels) do
local blip = AddBlipForCoord(v.rentcoord.x,v.rentcoord.y,v.rentcoord.z)
SetBlipSprite(blip,475)
SetBlipColour(blip,2)
SetBlipAsShortRange(blip,true)
SetBlipScale(blip,0.6)
BeginTextCommandSetBlipName("STRING")
AddTextComponentString(v.label)
EndTextCommandSetBlipName(blip)
end
end
RegisterNetEvent('renzu_motels:invoice')
AddEventHandler('renzu_motels:invoice', function(data)
local motels = GlobalState.Motels
local buy = lib.alertDialog({
header = 'Invoice',
content = '![motel](nui://renzu_motels/data/image/'..data.motel..'.png) \n ## INFO \n **Description:** '..data.description..' \n **Amount:** $ '..data.amount..' \n **Payment method:** '..data.payment,
centered = true,
labels = {
cancel = 'close',
confirm = 'Pay'
},
cancel = true
})
if buy ~= 'cancel' then
local success = lib.callback.await('renzu_motels:payinvoice',false,data)
if success then
Notify('You Successfully Pay the Invoice','success')
else
Notify('Fail to Pay the Invoice','error')
end
end
end)
DoesPlayerHaveAccess = function(data)
for identifier, _ in pairs(data) do
if identifier == PlayerData?.identifier then return true end
end
return false
end
DoesPlayerHaveKey = function(data,room)
local items = GetInventoryItems('keys')
if not items then return false end
for k,v in pairs(items) do
if v.metadata?.type == data.motel and v.metadata?.serial == data.index then
return v.metadata?.owner and room?.players[v.metadata?.owner] or false
end
end
return false
end
GetPlayerKeys = function(data,room)
local items = GetInventoryItems('keys')
if not items then return false end
local keys = {}
for k,v in pairs(items) do
if v.metadata?.type == data.motel and v.metadata?.serial == data.index then
local key = v.metadata?.owner and room?.players[v.metadata?.owner]
if key then
keys[v.metadata.owner] = key.name
end
end
end
return keys
end
SetDoorState = function(data)
local motels = GlobalState.Motels or {}
local doorindex = data.index + (joaat(data.motel))
DoorSystemSetDoorState(doorindex, 1)
end
RegisterNetEvent('renzu_motels:Door', function(data)
if not data.Mlo then return end
local doorindex = data.doorindex + (joaat(data.motel))
DoorSystemSetDoorState(doorindex, DoorSystemGetDoorState(doorindex) == 0 and 1 or 0, false, false)
end)
Door = function(data)
local dist = #(data.coord - GetEntityCoords(cache.ped)) < 2
local motel = GlobalState.Motels[data.motel]
local moteldoor = motel and motel.rooms[data.index]
if moteldoor and DoesPlayerHaveAccess(motel.rooms[data.index].players)
or moteldoor and DoesPlayerHaveKey(data,moteldoor) or IsOwnerOrEmployee(data.motel) then
lib.RequestAnimDict('mp_doorbell')
TaskPlayAnim(PlayerPedId(), "mp_doorbell", "open_door", 1.0, 1.0, 1000, 1, 1, 0, 0, 0)
TriggerServerEvent('renzu_motels:Door', {
motel = data.motel,
index = data.index,
doorindex = data.doorindex,
coord = data.coord,
Mlo = data.Mlo,
})
local text
if data.Mlo then
local doorindex = data.index + (joaat(data.motel))
text = DoorSystemGetDoorState(doorindex) == 0 and 'You Locked the Motel Door' or 'You Unlocked the Motel Door'
else
text = not moteldoor?.lock and 'You Locked the Motel Door' or 'You Unlocked the Motel Door'
end
Wait(1000)
--PlaySoundFromEntity(-1, "Hood_Open", cache.ped , 'Lowrider_Super_Mod_Garage_Sounds', 0, 0)
local data = {
file = 'door',
volume = 0.5
}
SendNUIMessage({
type = "playsound",
content = data
})
Notify(text, 'inform')
else
Notify('you dont have access', 'error')
end
end
isRentExpired = function(data)
local motels = GlobalState.Motels[data.motel]
local room = motels?.rooms[data.index] or {}
local player = room?.players[PlayerData.identifier] or {}
return player?.duration and player?.duration < GlobalState.MotelTimer
end
RoomFunction = function(data,identifier)
if isRentExpired(data) then
return Notify('Your Rent is Due. \n Please Pay to Access')
end
if data.type == 'door' then
return Door(data)
elseif data.type == 'stash' then
local stashid = identifier or data.uniquestash and PlayerData.identifier or 'room'
return OpenStash(data,stashid)
elseif data.type == 'wardrobe' then
return config.wardrobes[config.wardrobe]()
elseif config.extrafunction[data.type] then
local stashid = identifier or data.uniquestash and PlayerData.identifier or 'room'
return config.extrafunction[data.type](data,stashid)
end
end
LockPick = function(data)
local success = nil
SetTimeout(1000,function()
repeat
local lockpick = lib.progressBar({
duration = 10000,
label = 'Breaking in..',
useWhileDead = false,
canCancel = true,
anim = {
dict = 'veh@break_in@0h@p_m_one@',
clip = 'low_force_entry_ds'
},
})
Wait(0)
until success ~= nil
end)
success = lib.skillCheck({'easy', 'easy', {areaSize = 60, speedMultiplier = 2}, 'easy'})
if lib.progressActive() then
lib.cancelProgress()
end
if success then
TriggerServerEvent('renzu_motels:Door', {
motel = data.motel,
index = data.index,
doorindex = data.doorindex,
coord = data.coord,
Mlo = data.Mlo
})
local doorindex = data.index + (joaat(data.motel))
Notify(DoorSystemGetDoorState(doorindex) == 0 and 'You Locked the Motel Door' or 'You Unlocked the Motel Door', 'inform')
end
end
Notify = function(msg,type)
lib.notify({
description = msg,
type = type or 'inform'
})
end
MyRoomMenu = function(data)
local motels = GlobalState.Motels
local rate = motels[data.motel].hour_rate or data.rate
local options = {
{
title = 'My Room ['..data.index..'] - Pay a rent',
description = 'Pay your rent in due or advanced to Door '..data.index..' \n Rent Duration: '..data.duration..' \n '..data.rental_period..' Rate: $ '..rate,
icon = 'money-bill-wave-alt',
onSelect = function()
local input = lib.inputDialog('Pay or Deposit to motel', {
{type = 'number', label = 'Amount to Deposit', description = '$ '..rate..' per '..data.rental_period..' \n Payment Method: '..data.payment, icon = 'money', default = rate},
})
if not input then return end
local success = lib.callback.await('renzu_motels:payrent',false,{
payment = data.payment,
index = data.index,
motel = data.motel,
amount = input[1],
rate = rate,
rental_period = data.rental_period
})
if success then
Notify('Successfully pay a rent', 'success')
else
Notify('Fail to pay a rent', 'error')
end
end,
arrow = true,
},
{
title = 'Generate Key Item',
description = 'Request a Door Key',
icon = 'key',
onSelect = function()
local success = lib.callback.await('renzu_motels:motelkey',false,{
index = data.index,
motel = data.motel,
})
if success then
Notify('Successfully requested a sharable motel key', 'success')
else
Notify('Fail to Generate Key', 'error')
end
end,
arrow = true,
},
{
title = 'End Rent',
description = 'End your rental period',
icon = 'ban',
onSelect = function()
if isRentExpired(data) then
Notify('Failed to End rent to room '..data.index..' \n Reason: your have a Balance Debt to pay','error')
return
end
local End = lib.alertDialog({
header = '## Warning',
content = ' You will no longer have access to the door and to your safes.',
centered = true,
labels = {
cancel = 'close',
confirm = 'End',
},
cancel = true
})
if End == 'cancel' then return end
local success = lib.callback.await('renzu_motels:removeoccupant',false,data,data.index,PlayerData.identifier)
if success then
Notify('Successfully End Your Rent to room '..data.index,'success')
else
Notify('Failed to End rent to room '..data.index,'error')
end
end,
arrow = true,
},
}
lib.registerContext({
id = 'myroom',
menu = 'roomlist',
title = 'My Motel Room Option',
options = options
})
lib.showContext('myroom')
end
CountOccupants = function(players)
local count = 0
for k,v in pairs(players or {}) do
count += 1
end
return count
end
RoomList = function(data)
local motels , time = lib.callback.await('renzu_motels:getMotels',false)
local rate = motels[data.motel].hour_rate or data.rate
local options = {}
--local motels = GlobalState.Motels
for doorindex,v in ipairs(data.doors) do
local playerroom = motels[data.motel].rooms[doorindex].players[PlayerData.identifier]
local duration = playerroom?.duration
local occupants = CountOccupants(motels[data.motel].rooms[doorindex].players)
if occupants < data.maxoccupants and not duration then
table.insert(options,{
title = 'Rent Motel room #'..doorindex,
description = 'Choose room #'..doorindex..' \n Occupants: '..occupants..'/'..data.maxoccupants,
icon = 'door-closed',
onSelect = function()
local input = lib.inputDialog('Rent Duration', {
{type = 'number', label = 'Select a Duration in '..data.rental_period..'s', description = '$ '..rate..' per '..data.rental_period..' \n Payment Method: '..data.payment, icon = 'clock', default = 1},
})
if not input then return end
local success = lib.callback.await('renzu_motels:rentaroom',false,{
index = doorindex,
motel = data.motel,
duration = input[1],
rate = rate,
rental_period = data.rental_period,
payment = data.payment,
uniquestash = data.uniquestash
})
if success then
Notify('Successfully rent a room', 'success')
else
Notify('Fail to Rent a Room', 'error')
end
end,
arrow = true,
})
elseif duration then
local hour = math.floor((duration - time) / 3600)
local duration_left = hour .. ' Hours : '..math.floor(((duration - time) / 60) - (60 * hour))..' Minutes'
table.insert(options,{
title = 'My Room Door #'..doorindex..' Options',
description = 'Pay your rent or request a motel key',
icon = 'cog',
onSelect = function()
return MyRoomMenu({
payment = data.payment,
index = doorindex,
motel = data.motel,
duration = duration_left,
rate = rate,
rental_period = data.rental_period
})
end,
arrow = true,
})
end
end
lib.registerContext({
id = 'roomlist',
menu = 'rentmenu',
title = 'Choose a Room',
options = options
})
lib.showContext('roomlist')
end
IsOwnerOrEmployee = function(motel)
local motels = GlobalState.Motels
return motels[motel].owned == PlayerData.identifier or motels[motel].employees[PlayerData.identifier]
end
MotelRentalMenu = function(data)
local motels = GlobalState.Motels
local rate = motels[data.motel].hour_rate or data.rate
local options = {}
if not data.manual then
table.insert(options,{
title = 'Rent a New Motel room',
description = '![rent](nui://renzu_motels/data/image/'..data.motel..'.png) \n Choose a room to rent \n '..data.rental_period..' Rate: $'..rate,
icon = 'hotel',
onSelect = function()
return RoomList(data)
end,
arrow = true,
})
end
if not motels[data.motel].owned and config.business or IsOwnerOrEmployee(data.motel) and config.business then
local title = not motels[data.motel].owned and 'Buy Motel Business' or 'Motel Management'
local description = not motels[data.motel].owned and 'Cost: '..data.businessprice or 'Manage Employees , Occupants and finance.'
table.insert(options,{
title = title,
description = description,
icon = 'hotel',
onSelect = function()
return MotelOwner(data)
end,
arrow = true,
})
end
if #options == 0 then
Notify('This Motels Manually Accept Occupants \n Contact the Owner')
Wait(1500)
return SendMessageApi(data.motel)
end
lib.registerContext({
id = 'rentmenu',
title = data.label,
options = options
})
lib.showContext('rentmenu')
end
SendMessageApi = function(motel)
local message = lib.alertDialog({
header = 'Do you want to Message the Owner?',
content = '## Message Motel Owner',
centered = true,
labels = {
cancel = 'close',
confirm = 'Message',
},
cancel = true
})
if message == 'cancel' then return end
local input = lib.inputDialog('Message', {
{type = 'input', label = 'Title', description = 'title of your message', icon = 'hash', required = true},
{type = 'textarea', label = 'Description', description = 'your message', icon = 'mail', required = true},
{type = 'number', label = 'Contact Number', icon = 'phone', required = false},
})
config.messageApi({title = input[1], message = input[2], motel = motel})
end
Owner = {}
Owner.Rooms = {}
Owner.Rooms.Occupants = function(data,index)
local motels , time = lib.callback.await('renzu_motels:getMotels',false)
local motel = motels[data.motel]
local players = motel.rooms[index] and motel.rooms[index].players or {}
local options = {}
for player,char in pairs(players) do
local hour = math.floor((char.duration - time) / 3600)
local name = char.name or 'No Name'
local duration_left = hour .. ' Hours : '..math.floor(((char.duration - time) / 60) - (60 * hour))..' Minutes'
table.insert(options,{
title = 'Occupant '..name,
description = 'Rent Duration: '..duration_left,
icon = 'hotel',
onSelect = function()
local kick = lib.alertDialog({
header = 'Confirmation',
content = '## Kick Occupant \n **Name:** '..name,
centered = true,
labels = {
cancel = 'close',
confirm = 'Kick',
waw = 'waw'
},
cancel = true
})
if kick == 'cancel' then return end
local success = lib.callback.await('renzu_motels:removeoccupant',false,data,index,player)
if success then
Notify('Successfully kicked '..name..' from room '..index,'success')
else
Notify('Failed to kicked '..name..' from room '..index,'error')
end
end,
arrow = true,
})
end
if data.maxoccupants > #options then
for i = 1, data.maxoccupants-#options do
table.insert(options,{
title = 'Vacant Slot ',
icon = 'hotel',
onSelect = function()
local input = lib.inputDialog('New Occupant', {
{type = 'number', label = 'Citizen ID', description = 'ID of the citizen you want to add', icon = 'id-card', required = true},
{type = 'number', label = 'Select a Duration in '..data.rental_period..'s', description = 'how many '..data.rental_period..'s', icon = 'clock', default = 1},
})
if not input then return end
local success = lib.callback.await('renzu_motels:addoccupant',false,data,index,input)
if success == 'exist' then
Notify('Already exist from room '..index,'error')
elseif success then
Notify('Successfully Add '..input[1]..' from room '..index,'success')
else
Notify('Failed to Add '..input[1]..' from room '..index,'error')
end
end,
arrow = true,
})
end
end
lib.registerContext({
menu = 'owner_rooms',
id = 'occupants_lists',
title = 'Room #'..index..' Occupants',
options = options
})
lib.showContext('occupants_lists')
end
Owner.Rooms.List = function(data)
local motels = GlobalState.Motels
local options = {}
for doorindex,v in ipairs(data.doors) do
local occupants = CountOccupants(motels[data.motel].rooms[doorindex].players)
table.insert(options,{
title = 'Room #'..doorindex,
description = 'Add or Kick Occupants from room #'..doorindex..' \n ***Occupants:*** '..occupants,
icon = 'hotel',
onSelect = function()
return Owner.Rooms.Occupants(data,doorindex)
end,
arrow = true,
})
end
lib.registerContext({
menu = 'motelmenu',
id = 'owner_rooms',
title = data.label,
options = options
})
lib.showContext('owner_rooms')
end
Owner.Employee = {}
Owner.Employee.Manage = function(data)
local motel = GlobalState.Motels[data.motel]
local options = {
{
title = 'Add Employee',
description = 'Add nearby citizen to your motel employees',
icon = 'hotel',
onSelect = function()
local input = lib.inputDialog('Add Employee', {
{type = 'number', label = 'Citizen ID', description = 'ID of the citizen you want to add', icon = 'id-card', required = true},
})
if not input then return end
local success = lib.callback.await('renzu_motels:addemployee',false,data.motel,input[1])
if success then
Notify('Successfully Add to Employee Lists','success')
else
Notify('Failed to Add to Employee','error')
end
end,
arrow = true,
}
}
if motel and motel.employees then
for identifier,name in pairs(motel.employees) do
table.insert(options,{
title = name,
description = 'remove '..name..' to your Employee Lists',
icon = 'hotel',
onSelect = function()
local success = lib.callback.await('renzu_motels:removeemployee',false,data.motel,identifier)
if success then
Notify('Successfully remove from Employee Lists','success')
else
Notify('Failed to remove from Employee','error')
end
end,
arrow = true,
})
end
end
lib.registerContext({
id = 'employee_manage',
title = 'Employee Manage',
options = options
})
lib.showContext('employee_manage')
end
MotelOwner = function(data)
local motels = GlobalState.Motels
if not motels[data.motel].owned then
local buy = lib.alertDialog({
header = data.label,
content = '![motel](nui://renzu_motels/data/image/'..data.motel..'.png) \n ## INFO \n **Rooms:** '..#data.doors..' \n **Maximum Occupants:** '..#data.doors * data.maxoccupants..' \n **Price:** $'..data.businessprice,
centered = true,
labels = {
cancel = 'close',
confirm = 'buy'
},
cancel = true
})
if buy ~= 'cancel' then
local success = lib.callback.await('renzu_motels:buymotel',false,data)
if success then
Notify('You Successfully buy the motel','success')
else
Notify('Fail to buy the motel','error')
end
end
elseif IsOwnerOrEmployee(data.motel) then
local revenue = motels[data.motel].revenue or 0
local rate = motels[data.motel].hour_rate or data.rate
local options = {
{
title = 'Motel Rooms',
description = 'Add or Kick Occupants',
icon = 'hotel',
onSelect = function()
return Owner.Rooms.List(data)
end,
arrow = true,
},
{
title = 'Send Invoice',
description = 'Invoice nearby citizens',
icon = 'hotel',
onSelect = function()
local input = lib.inputDialog('Send Invoice', {
{type = 'number', label = 'Citizen ID', description = 'id of nearby citizen', icon = 'money', required = true},
{type = 'number', label = 'Amount', description = 'total amount to request', icon = 'money', required = true},
{type = 'input', label = 'Describe', description = 'Description of Invoice', icon = 'info'},
{type = 'checkbox', label = 'Payment Bank'},
})
if not input then return end
Notify('You Successfully Send the Invoice to '..input[1],'success')
local success = lib.callback.await('renzu_motels:sendinvoice',false,data.motel,input)
if success then
Notify('Invoice has been paid','success')
else
Notify('Invoice is not paid','error')
end
end,
arrow = true,
}
}
if motels[data.motel].owned == PlayerData.identifier then
table.insert(options,{
title = 'Adjust Hour Rates',
description = 'Modify current '..data.rental_period..' rates. \n '..data.rental_period..' Rates: '..rate,
icon = 'hotel',
onSelect = function()
local input = lib.inputDialog('Edit '..data.rental_period..' Rate', {
{type = 'number', label = 'Rate', description = 'Rate per '..data.rental_period..'', icon = 'money', required = true},
})
if not input then return end
local success = lib.callback.await('renzu_motels:editrate',false,data.motel,input[1])
if success then
Notify('You Successfully Change the '..data.rental_period..' Rate','success')
else
Notify('Fail to Modify','error')
end
end,
arrow = true,
})
table.insert(options,{
title = 'Motel Revenue',
description = 'Total: '..revenue,
icon = 'hotel',
onSelect = function()
local input = lib.inputDialog('Withdraw Funds', {
{type = 'number', label = 'Fund Amount', icon = 'money', required = true},
})
if not input then return end
local success = lib.callback.await('renzu_motels:withdrawfund',false,data.motel,input[1])
if success then
Notify('You Successfully Withdraw Funds','success')
else
Notify('Fail to Withdraw','error')
end
end,
arrow = true,
})
table.insert(options,{
title = 'Employee Management',
description = 'Add / Remove Employee',
icon = 'hotel',
onSelect = function()
return Owner.Employee.Manage(data)
end,
arrow = true,
})
table.insert(options,{
title = 'Transfer Ownership',
description = 'transfer to other nearby citizens',
icon = 'hotel',
onSelect = function()
local input = lib.inputDialog('Transfer Motel', {
{type = 'number', label = 'Citizen ID', description = 'ID of the citizen you want to be transfered', icon = 'id-card', required = true},
})
if not input then return end
local success = lib.callback.await('renzu_motels:transfermotel',false,data.motel,input[1])
if success then
Notify('Successfully Transfer Motel Ownership','success')
else
Notify('Failed to Transfer','error')
end
end,
arrow = true,
})
table.insert(options,{
title = 'Sell Motel',
description = 'Sell motel for half price',
icon = 'hotel',
onSelect = function()
local sell = lib.alertDialog({
header = data.label,
content = '![motel](nui://renzu_motels/data/image/'..data.motel..'.png) \n ## INFO \n **Selling Value:** $'..data.businessprice / 2,
centered = true,
labels = {
cancel = 'close',
confirm = 'Sell'
},
cancel = true
})
if sell ~= 'cancel' then
local success = lib.callback.await('renzu_motels:sellmotel',false,data)
if success then
Notify('You Successfully Sell the motel','success')
else
Notify('Fail to sell the motel','error')
end
end
end,
arrow = true,
})
end
lib.registerContext({
id = 'motelmenu',
menu = 'rentmenu',
title = data.label,
options = options
})
lib.showContext('motelmenu')
end
end
MotelRentalPoints = function(data)
local point = lib.points.new(data.rentcoord, 5, data)
function point:onEnter()
lib.showTextUI('[E] - Motel Rent', {
position = "top-center",
icon = 'hotel',
style = {
borderRadius = 0,
backgroundColor = '#48BB78',
color = 'white'
}
})
end
function point:onExit()
lib.hideTextUI()
end
function point:nearby()
DrawMarker(2, self.coords.x, self.coords.y, self.coords.z, 0.0, 0.0,0.0, 0.0, 180.0, 0.0, 0.7, 0.7, 0.7, 225, 225, 211, 50, false,true, 2, nil, nil, false)
if self.currentDistance < 1 and IsControlJustReleased(0, 38) then
MotelRentalMenu(data)
end
end
return point
end
local inMotelZone = false
MotelZone = function(data)
local point = nil
function onEnter(self)
inMotelZone = true
Citizen.CreateThreadNow(function()
for index, doors in pairs(data.doors) do
for type, door in pairs(doors) do
if type == 'door' then
for doorindex,v in pairs(door) do
MotelFunction({
payment = data.payment or 'money',
uniquestash = data.uniquestash,
shell = data.shell,
Mlo = data.Mlo,
type = type,
index = index,
doorindex = index + doorindex,
coord = v.coord,
label = config.Text[type],
motel = data.motel,
door = v.model
})
end
else
MotelFunction({
payment = data.payment or 'money',
uniquestash = data.uniquestash,
shell = data.shell,
Mlo = data.Mlo,
type = type,
index = index,
coord = door,
label = config.Text[type],
motel = data.motel,
door = data.door
})
end
end
end
point = MotelRentalPoints(data)
end)
end
function onExit(self)
inMotelZone = false
point:remove()
for k,id in pairs(zones) do
removeTargetZone(id)
end
for k,id in pairs(blips) do
if DoesBlipExist(id) then
RemoveBlip(id)
end
end
zones = {}
end
local sphere = lib.zones.sphere({
coords = data.coord,
radius = data.radius,
debug = false,
inside = inside,
onEnter = onEnter,
onExit = onExit
})
end
--qb-interior func
local house
local inhouse = false
function Teleport(x, y, z, h ,exit)
CreateThread(function()
SetEntityCoords(cache.ped, x, y, z, 0, 0, 0, false)
SetEntityHeading(cache.ped, h or 0.0)
Wait(1001)
DoScreenFadeIn(1000)
end)
if exit then
inhouse = false
TriggerEvent('qb-weathersync:client:EnableSync')
for k,id in pairs(shelzones) do
removeTargetZone(id)
end
DeleteEntity(house)
lib.callback.await('renzu_motels:SetRouting',false,data,'exit')
shelzones = {}
DeleteResourceKvp(kvpname)
LocalPlayer.state:set('inshell',false,true)
end
end
EnterShell = function(data,login)
local motels = GlobalState.Motels
if motels[data.motel].rooms[data.index].lock and not login then
Notify('Door is Locked', 'error')
return false
end
local shelldata = config.shells[data.shell or data.motel]
if not shelldata then
warn('Shell is not configure')
return
end
lib.callback.await('renzu_motels:SetRouting',false,data,'enter')
inhouse = true
Wait(1000)
local spawn = vec3(data.coord.x,data.coord.y,data.coord.z)+vec3(0.0,0.0,1500.0)
local offsets = shelldata.offsets
local model = shelldata.shell
DoScreenFadeOut(500)
while not IsScreenFadedOut() do
Wait(10)
end
inhouse = true
TriggerEvent('qb-weathersync:client:DisableSync')
RequestModel(model)
while not HasModelLoaded(model) do
Wait(1000)
end
local lastloc = GetEntityCoords(cache.ped)
house = CreateObject(model, spawn.x, spawn.y, spawn.z, false, false, false)
FreezeEntityPosition(house, true)
LocalPlayer.state:set('lastloc',data.lastloc or lastloc,false)
data.lastloc = data.lastloc or lastloc
if not login then
SendNUIMessage({
type = 'door'
})
end
Teleport(spawn.x + offsets.exit.x, spawn.y + offsets.exit.y, spawn.z+0.1, offsets.exit.h)
SetResourceKvp(kvpname,json.encode(data))
Citizen.CreateThreadNow(function()
ShellTargets(data,offsets,spawn,house)
while inhouse do
--SetRainLevel(0.0)
SetWeatherTypePersist('CLEAR')
SetWeatherTypeNow('CLEAR')
SetWeatherTypeNowPersist('CLEAR')
NetworkOverrideClockTime(18, 0, 0)
Wait(1)
end
end)
return house
end
function RotationToDirection(rotation)
local adjustedRotation =
{
x = (math.pi / 180) * rotation.x,
y = (math.pi / 180) * rotation.y,
z = (math.pi / 180) * rotation.z
}
local direction =
{
x = -math.sin(adjustedRotation.z) * math.abs(math.cos(adjustedRotation.x)),
y = math.cos(adjustedRotation.z) * math.abs(math.cos(adjustedRotation.x)),
z = math.sin(adjustedRotation.x)
}
return direction
end
function RayCastGamePlayCamera(distance,flag)
local cameraRotation = GetGameplayCamRot()
local cameraCoord = GetGameplayCamCoord()
local direction = RotationToDirection(cameraRotation)
local destination = vector3(cameraCoord.x + direction.x * distance,
cameraCoord.y + direction.y * distance,
cameraCoord.z + direction.z * distance
)
if not flag then
flag = 1
end
local a, b, c, d, e = GetShapeTestResultIncludingMaterial(StartShapeTestRay(cameraCoord.x, cameraCoord.y, cameraCoord.z, destination.x, destination.y, destination.z, flag, -1, 1))
return b, c, e, destination
end
local lastweapon = nil
lib.onCache('weapon', function(weapon)
if not inMotelZone then return end
if not PlayerData.job then return end
if not config.breakinJobs[PlayerData.job.name] then return end
local motels = GlobalState.Motels
lastweapon = weapon
while weapon and weapon == lastweapon do
Wait(33)
if IsPedShooting(cache.ped) then
local _, bullet, _ = RayCastGamePlayCamera(200.0,1)
for k,data in pairs(config.motels) do
for k,v in pairs(data.doors) do
if v.door then
for k2,v in pairs(v.door) do
if #(vec3(bullet.x,bullet.y,bullet.z) - vec3(v.coord.x,v.coord.y,v.coord.z)) < 2 and motels[data.motel].rooms[k].lock then
TriggerServerEvent('renzu_motels:Door', {
motel = data.motel,
index = k,
doorindex = k + k2,
coord = v.coord,
Mlo = data.Mlo,
})
local text
if data.Mlo then
local doorindex = (k + k2) + (joaat(data.motel))
text = DoorSystemGetDoorState(doorindex) == 0 and 'You Destroy the Motel Door'
else
text = 'You Destroy the Motel Door'
end
Notify(text,'warning')
end
end
end
end
Wait(1000)
end
end
end
end)
RegisterNetEvent('renzu_motels:MessageOwner', function(data)
AddTextEntry('esxAdvancedNotification', data.message)
BeginTextCommandThefeedPost('esxAdvancedNotification')
ThefeedSetNextPostBackgroundColor(1)
AddTextComponentSubstringPlayerName(data.message)
EndTextCommandThefeedPostMessagetext('CHAR_FACEBOOK', 'CHAR_FACEBOOK', false, 1, data.motel, data.title)
EndTextCommandThefeedPostTicker(flash or false, true)
end)
Citizen.CreateThread(function()
while GlobalState.Motels == nil do Wait(1) end
for motel, data in pairs(config.motels) do
MotelZone(data)
end
CreateBlips()
end)