├── script ├── server.lua └── client.lua ├── shared ├── config.lua └── locales.lua ├── fxmanifest.lua └── README.md /script/server.lua: -------------------------------------------------------------------------------- 1 | -- SNR STORE | https://discord.gg/TtHFpf3enK 2 | RegisterNetEvent('snr:motel:print') 3 | AddEventHandler('snr:motel:print', function(yazi) 4 | print(yazi) 5 | end) -------------------------------------------------------------------------------- /shared/config.lua: -------------------------------------------------------------------------------- 1 | Config = {} -- SNR STORE | https://discord.gg/TtHFpf3enK 2 | 3 | Config.ESXorQBorNewQB = "esx" -- esx | qb | newqb 4 | Config.Target = false -- need qb or newqb 5 | 6 | Config.MotelBlip = vector3(326.747, -208.35, 54.0866) -- Motel Blip Coords 7 | Config.MotelBlipIsim = "PinkCage Motel" --Motel Blip Name 8 | -------------------------------------------------------------------------------- /fxmanifest.lua: -------------------------------------------------------------------------------- 1 | fx_version 'bodacious' -- SNR STORE | https://discord.gg/TtHFpf3enK 2 | lua54 'yes' 3 | game 'gta5' 4 | 5 | client_scripts { 6 | "script/client.lua" 7 | } 8 | 9 | server_scripts { 10 | "script/server.lua" 11 | } 12 | 13 | shared_scripts { 14 | "shared/config.lua", 15 | "shared/locales.lua" 16 | } 17 | -------------------------------------------------------------------------------- /shared/locales.lua: -------------------------------------------------------------------------------- 1 | locale = {} -- SNR STORE | https://discord.gg/TtHFpf3enK 2 | 3 | locale.uyari = "snr-motel Scripttindeki shared/config.lua üzerinden Config.ESXorQBorNewQB seçeneğini doğru giriniz! (esx/qb/newqb)" 4 | locale.Newmotel = 'Yeni motel odası verildi! Oda numaran: ' 5 | locale.sandik = '[~g~E~w~] - Sandık' 6 | locale.gardrop = '[~g~E~w~] - Gardrop' 7 | locale.targetsandik = "Sandığı aç" 8 | locale.targetgardrop = "Gardıropu aç" -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # snr-motelv2 2 | Arkadaşlar v1 basit kaçtığı için v2 olarak qb-target destekli hem esx hem qbye tek hareketle ayarlayabildiğiniz, nefes alan her varlığın kurabildiği basit bir motel scripti! 3 | 4 | Piyasaya tekrardan yavaş yavaş dönüş sağlıyorum bunun gibi basit scleri yazıp yazıp paylaşıcam, Hem destek için discorduma katılabilir hemi de aklınıza takılanları ticket ile sorabilirsiniz. İmzamdan discorda katılabilirsiniz! 5 | 6 | -Oyuna girdiğiniz de rastgele motel odası verir. 7 | 8 | - Target'i sadece qbcore altyapı kullanabilir! 9 | 10 | - shared/config.lua üzerinden framework ayarı yapabilirsiniz. 11 | 12 | - Scriptteki kodları kopyalayıp kullanabilirsiniz, Ne de olsa paylaşım yapıyorum isteyen adını da değiştirebilir. 13 | 14 | - shared/config.lua üzerinden blip ayarı yapabilirsiniz. 15 | 16 | ​- Fotoğraftaki maplerin de paylaşımını yaptım, yapımcısını hatırlamıyorum ama onu da yanında paylaştım. 17 | -------------------------------------------------------------------------------- /script/client.lua: -------------------------------------------------------------------------------- 1 | -- SNR STORE | https://discord.gg/TtHFpf3enK 2 | local QBCore = nil 3 | local ESX = nil 4 | 5 | Citizen.CreateThread(function() 6 | while true do 7 | Citizen.Wait(5000) 8 | if Config.ESXorQBorNewQB == "esx" then 9 | ESX = nil 10 | Citizen.CreateThread(function() 11 | while ESX == nil do 12 | TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) 13 | Citizen.Wait(0) 14 | end 15 | ESX.PlayerData = ESX.GetPlayerData() 16 | end) 17 | break 18 | elseif Config.ESXorQBorNewQB == "qb" then 19 | QBCore = nil 20 | Citizen.CreateThread(function() 21 | while QBCore == nil do 22 | TriggerEvent('QBCore:GetObject', function(obj) QBCore = obj end) 23 | Citizen.Wait(30) -- Saniye Bekletme 24 | end 25 | end) 26 | break 27 | elseif Config.ESXorQBorNewQB == "newqb" then 28 | QBCore = exports['qb-core']:GetCoreObject() 29 | break 30 | else 31 | Citizen.CreateThread(function() 32 | while true do 33 | Citizen.Wait(500) 34 | TriggerServerEvent("snr:motel:print", locale.uyari) 35 | end 36 | end) 37 | end 38 | end 39 | end) 40 | 41 | local suankimoteli = nil 42 | local pinkcagecoord = Config.MotelBlip 43 | local pinkcage = { 44 | [1] = {door = vector3(307.57, -213.29, 54.22), h = 68.9096, doortext = vector3(307.318, -213.26, 54.2199), stash = vector3(306.71, -208.50, 54.22), obj = nil, clothe = vector3(302.58, -207.35, 54.22), locked = true}, 45 | [2] = {door = vector3(311.36, -203.46, 54.22), h = 68.9096, doortext = vector3(311.108, -203.39, 54.2199), stash = vector3(310.51, -198.61, 54.22), obj = nil, clothe = vector3(306.32, -197.45, 54.22), locked = true}, 46 | [3] = {door = vector3(315.79, -194.79, 54.22), h = 338.946, doortext = vector3(315.829, -194.65, 54.2267), stash = vector3(320.45, -194.13, 54.22), obj = nil, clothe = vector3(321.79, -189.81, 54.22), locked = true}, 47 | [4] = {door = vector3(315.84, -219.66, 58.02), h = 158.946, doortext = vector3(314.827, -219.78, 58.0220), stash = vector3(310.17, -220.36, 58.02), obj = nil, clothe = vector3(308.85, -224.63, 58.02), locked = true}, 48 | [5] = {door = vector3(307.35, -213.24, 58.02), h = 68.9096, doortext = vector3(307.322, -213.25, 58.0151), stash = vector3(306.78, -208.53, 58.02), obj = nil, clothe = vector3(302.52, -207.23, 58.02), locked = true}, 49 | [6] = {door = vector3(311.22, -203.35, 58.02), h = 68.9096, doortext = vector3(311.107, -203.40, 58.0151), stash = vector3(310.64, -198.74, 58.02), obj = nil, clothe = vector3(306.33, -197.41, 58.02), locked = true}, 50 | [7] = {door = vector3(315.78, -194.62, 58.02), h = 338.946, doortext = vector3(315.817, -194.64, 58.0151), stash = vector3(320.51, -194.11, 58.02), obj = nil, clothe = vector3(321.73, -189.70, 58.02), locked = true}, 51 | [8] = {door = vector3(339.20, -219.47, 54.22), h = 248.909, doortext = vector3(339.316, -219.52, 54.2199), stash = vector3(339.93, -224.19, 54.22), obj = nil, clothe = vector3(344.24, -225.47, 54.22), locked = true}, 52 | [9] = {door = vector3(342.93, -209.50, 54.22), h = 248.909, doortext = vector3(343.130, -209.61, 54.2199), stash = vector3(343.61, -214.35, 54.22), obj = nil, clothe = vector3(348.01, -215.56, 54.22), locked = true}, 53 | [10]= {door = vector3(346.78, -199.66, 54.22), h = 248.909, doortext = vector3(346.927, -199.74, 54.2199), stash = vector3(347.34, -204.44, 54.22), obj = nil, clothe = vector3(351.86, -205.67, 54.22), locked = true}, 54 | [11]= {door = vector3(335.00, -227.38, 58.02), h = 158.946, doortext = vector3(334.916, -227.47, 58.0150), stash = vector3(330.27, -228.04, 58.02), obj = nil, clothe = vector3(328.99, -232.40, 58.02), locked = true}, 55 | [12]= {door = vector3(339.27, -219.49, 58.02), h = 248.909, doortext = vector3(339.301, -219.53, 58.0150), stash = vector3(339.85, -224.16, 58.02), obj = nil, clothe = vector3(344.21, -225.51, 58.02), locked = true}, 56 | [13]= {door = vector3(343.08, -209.54, 58.02), h = 248.909, doortext = vector3(343.094, -209.64, 58.0150), stash = vector3(343.63, -214.27, 58.02), obj = nil, clothe = vector3(347.95, -215.52, 58.02), locked = true}, 57 | [14]= {door = vector3(346.69, -199.66, 58.02), h = 248.909, doortext = vector3(346.924, -199.73, 58.0150), stash = vector3(347.49, -204.41, 58.02), obj = nil, clothe = vector3(351.77, -205.64, 58.02), locked = true}, 58 | } 59 | 60 | RegisterNetEvent('QBCore:Client:OnPlayerLoaded') 61 | AddEventHandler('QBCore:Client:OnPlayerLoaded', function() 62 | if Config.ESXorQBorNewQB == "esx" then return end 63 | suankimoteli = math.random(1, #pinkcage) 64 | QBCore.Functions.Notify(locale.Newmotel ..suankimoteli, "success", 2500) 65 | end) 66 | 67 | RegisterNetEvent('esx:playerLoaded') 68 | AddEventHandler('esx:playerLoaded', function() 69 | if Config.ESXorQBorNewQB == "qb" or Config.ESXorQBorNewQB == "newqb" then return end 70 | suankimoteli = math.random(1, #pinkcage) 71 | TriggerEvent('notification', locale.Newmotel ..suankimoteli, 1) 72 | end) 73 | 74 | Citizen.CreateThread(function() 75 | local gblip = AddBlipForCoord(pinkcagecoord) 76 | SetBlipSprite(gblip, 475) 77 | SetBlipDisplay(gblip, 4) 78 | SetBlipScale (gblip, 0.7) 79 | SetBlipColour(gblip, 4) 80 | SetBlipAsShortRange(gblip, true) 81 | BeginTextCommandSetBlipName("STRING") 82 | AddTextComponentString(Config.MotelBlipIsim) 83 | EndTextCommandSetBlipName(gblip) 84 | end) 85 | 86 | local stashCoord = vector3(-1231.6, 3878.42, 154.114) 87 | local clotheCoord = vector3(-1236.0, 3880.17, 154.114) 88 | local beklemewaitmotel = 500 89 | 90 | Citizen.CreateThread(function() 91 | while true do 92 | Citizen.Wait(beklemewaitmotel) 93 | if suankimoteli ~= nil then 94 | local player = PlayerPedId() 95 | local playercoords = GetEntityCoords(player) 96 | local stashdistance = #(playercoords - pinkcage[suankimoteli].stash) 97 | local clothedistance = #(playercoords - pinkcage[suankimoteli].clothe) 98 | local doordistance = #(playercoords - pinkcage[suankimoteli].doortext) 99 | local moteldistance = #(playercoords - pinkcagecoord) 100 | 101 | if moteldistance <= 45.0 then 102 | beklemewaitmotel = 1 103 | if doordistance <= 30.0 then 104 | DrawMarker(2, pinkcage[suankimoteli].doortext.x, pinkcage[suankimoteli].doortext.y, pinkcage[suankimoteli].doortext.z - 0.3, 0, 0, 0, 0, 0, 0, 0.2, 0.2, 0.2, 32, 236, 54, 100, 0, 0, 0, 1, 0, 0, 0) 105 | end 106 | if stashdistance <= 1.5 then 107 | if Config.Target == true then 108 | if Config.ESXorQBorNewQB == "esx" then 109 | DrawText3D(pinkcage[suankimoteli].stash, locale.sandik) 110 | if IsControlJustReleased(0, 38) then 111 | OpenMotelInventory() 112 | end 113 | else 114 | exports["qb-target"]:AddBoxZone( 115 | "Sandıks", 116 | vector3(pinkcage[suankimoteli].stash), 117 | 2, 118 | 2, 119 | { 120 | name = "snrmotel", 121 | heading = pinkcage[suankimoteli].h, 122 | debugPoly = false, 123 | minZ = 18.669, 124 | maxZ = 999.87834 125 | }, 126 | { 127 | options = { 128 | { 129 | type = "Client", 130 | event = "snr:motelstash", 131 | icon = "fas fa-circle", 132 | label = locale.targetsandik 133 | } 134 | }, 135 | distance = 1.5 136 | } 137 | ) 138 | end 139 | else 140 | DrawText3D(pinkcage[suankimoteli].stash, locale.sandik) 141 | if IsControlJustReleased(0, 38) then 142 | OpenMotelInventory() 143 | end 144 | end 145 | end 146 | if clothedistance <= 1.5 then 147 | if Config.Target == true then 148 | if Config.ESXorQBorNewQB == "esx" then 149 | DrawText3D(pinkcage[suankimoteli].clothe, locale.gardrop) 150 | if IsControlJustReleased(0, 38) then 151 | OpenMotelWardrobe() 152 | end 153 | else 154 | exports["qb-target"]:AddBoxZone( 155 | "Gardorps", 156 | vector3(pinkcage[suankimoteli].clothe), 157 | 2, 158 | 2, 159 | { 160 | name = "snrmotel", 161 | heading = pinkcage[suankimoteli].h, 162 | debugPoly = false, 163 | minZ = 18.669, 164 | maxZ = 999.87834 165 | }, 166 | { 167 | options = { 168 | { 169 | type = "Client", 170 | event = "snr:gardirop", 171 | icon = "fas fa-circle", 172 | label = locale.targetgardrop 173 | } 174 | }, 175 | distance = 1.5 176 | } 177 | ) 178 | end 179 | else 180 | DrawText3D(pinkcage[suankimoteli].clothe, locale.gardrop) 181 | if IsControlJustReleased(0, 38) then 182 | OpenMotelWardrobe() 183 | end 184 | end 185 | end 186 | else 187 | beklemewaitmotel = 2500 188 | end 189 | end 190 | end 191 | end) 192 | 193 | RegisterNetEvent("snr:gardirop") 194 | AddEventHandler("snr:gardirop", function() 195 | if Config.ESXorQBorNewQB == "esx" then 196 | ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'room',{ 197 | title = 'Gardrop', 198 | align = 'right', 199 | elements = { 200 | {label = 'Kıyafetler', value = 'player_dressing'}, 201 | {label = 'Kıyafet Sil', value = 'remove_cloth'} 202 | } 203 | }, function(data, menu) 204 | 205 | if data.current.value == 'player_dressing' then 206 | menu.close() 207 | ESX.TriggerServerCallback('motel:server:getPlayerDressing', function(dressing) 208 | elements = {} 209 | 210 | for i=1, #dressing, 1 do 211 | table.insert(elements, { 212 | label = dressing[i], 213 | value = i 214 | }) 215 | end 216 | 217 | ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'player_dressing', 218 | { 219 | title = 'Kıyafetler', 220 | align = 'right', 221 | elements = elements 222 | }, function(data2, menu2) 223 | 224 | TriggerEvent('skinchanger:getSkin', function(skin) 225 | ESX.TriggerServerCallback('motel:server:getPlayerOutfit', function(clothes) 226 | TriggerEvent('skinchanger:loadClothes', skin, clothes) 227 | TriggerEvent('esx_skin:setLastSkin', skin) 228 | 229 | TriggerEvent('skinchanger:getSkin', function(skin) 230 | TriggerServerEvent('esx_skin:save', skin) 231 | end) 232 | end, data2.current.value) 233 | end) 234 | 235 | end, function(data2, menu2) 236 | menu2.close() 237 | end) 238 | end) 239 | 240 | elseif data.current.value == 'remove_cloth' then 241 | menu.close() 242 | ESX.TriggerServerCallback('motel:server:getPlayerDressing', function(dressing) 243 | elements = {} 244 | 245 | for i=1, #dressing, 1 do 246 | table.insert(elements, { 247 | label = dressing[i], 248 | value = i 249 | }) 250 | end 251 | 252 | ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'remove_cloth', { 253 | title = 'Kıyafet Sil', 254 | align = 'right', 255 | elements = elements 256 | }, function(data2, menu2) 257 | menu2.close() 258 | TriggerServerEvent('motel:server:removeOutfit', data2.current.value) 259 | TriggerEvent('notification', 'Kıyafet silindi', 1) 260 | end, function(data2, menu2) 261 | menu2.close() 262 | end) 263 | end) 264 | end 265 | end, function(data, menu) 266 | menu.close() 267 | end) 268 | else 269 | TriggerEvent('qb-clothing:client:openOutfitMenu') 270 | end 271 | end) 272 | 273 | RegisterNetEvent("snr:motelstash") 274 | AddEventHandler("snr:motelstash", function() 275 | if Config.ESXorQBorNewQB == "esx" then 276 | ESX.PlayerData = xPlayer 277 | TriggerServerEvent("inventory:server:OpenInventory", "stash", "snrmotelstash_"..ESX.GetPlayerData().identifier) 278 | TriggerEvent("inventory:client:SetCurrentStash","snrmotelstash_"..ESX.GetPlayerData().identifier) 279 | else 280 | TriggerServerEvent("inventory:server:OpenInventory", "stash", "snrmotelstash_"..QBCore.Functions.GetPlayerData().citizenid) 281 | TriggerEvent("inventory:client:SetCurrentStash", "snrmotelstash_"..QBCore.Functions.GetPlayerData().citizenid) 282 | end 283 | end) 284 | 285 | function OpenMotelInventory() 286 | if Config.ESXorQBorNewQB == "esx" then 287 | ESX.PlayerData = xPlayer 288 | TriggerServerEvent("inventory:server:OpenInventory", "stash", "snrmotelstash_"..ESX.GetPlayerData().identifier) 289 | TriggerEvent("inventory:client:SetCurrentStash","snrmotelstash_"..ESX.GetPlayerData().identifier) 290 | else 291 | TriggerServerEvent("inventory:server:OpenInventory", "stash", "snrmotelstash_"..QBCore.Functions.GetPlayerData().citizenid) 292 | TriggerEvent("inventory:client:SetCurrentStash", "snrmotelstash_"..QBCore.Functions.GetPlayerData().citizenid) 293 | end 294 | end 295 | 296 | function OpenMotelWardrobe() 297 | if Config.ESXorQBorNewQB == "esx" then 298 | ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'room',{ 299 | title = 'Gardrop', 300 | align = 'right', 301 | elements = { 302 | {label = 'Kıyafetler', value = 'player_dressing'}, 303 | {label = 'Kıyafet Sil', value = 'remove_cloth'} 304 | } 305 | }, function(data, menu) 306 | 307 | if data.current.value == 'player_dressing' then 308 | menu.close() 309 | ESX.TriggerServerCallback('motel:server:getPlayerDressing', function(dressing) 310 | elements = {} 311 | 312 | for i=1, #dressing, 1 do 313 | table.insert(elements, { 314 | label = dressing[i], 315 | value = i 316 | }) 317 | end 318 | 319 | ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'player_dressing', 320 | { 321 | title = 'Kıyafetler', 322 | align = 'right', 323 | elements = elements 324 | }, function(data2, menu2) 325 | 326 | TriggerEvent('skinchanger:getSkin', function(skin) 327 | ESX.TriggerServerCallback('motel:server:getPlayerOutfit', function(clothes) 328 | TriggerEvent('skinchanger:loadClothes', skin, clothes) 329 | TriggerEvent('esx_skin:setLastSkin', skin) 330 | 331 | TriggerEvent('skinchanger:getSkin', function(skin) 332 | TriggerServerEvent('esx_skin:save', skin) 333 | end) 334 | end, data2.current.value) 335 | end) 336 | 337 | end, function(data2, menu2) 338 | menu2.close() 339 | end) 340 | end) 341 | 342 | elseif data.current.value == 'remove_cloth' then 343 | menu.close() 344 | ESX.TriggerServerCallback('motel:server:getPlayerDressing', function(dressing) 345 | elements = {} 346 | 347 | for i=1, #dressing, 1 do 348 | table.insert(elements, { 349 | label = dressing[i], 350 | value = i 351 | }) 352 | end 353 | 354 | ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'remove_cloth', { 355 | title = 'Kıyafet Sil', 356 | align = 'right', 357 | elements = elements 358 | }, function(data2, menu2) 359 | menu2.close() 360 | TriggerServerEvent('motel:server:removeOutfit', data2.current.value) 361 | TriggerEvent('notification', 'Kıyafet silindi', 1) 362 | end, function(data2, menu2) 363 | menu2.close() 364 | end) 365 | end) 366 | end 367 | end, function(data, menu) 368 | menu.close() 369 | end) 370 | else 371 | TriggerEvent('qb-clothing:client:openOutfitMenu') 372 | end 373 | end 374 | 375 | function DrawText3D(coord, text) 376 | local onScreen,_x,_y=GetScreenCoordFromWorldCoord(coord.x, coord.y, coord.z) 377 | local px,py,pz=table.unpack(GetGameplayCamCoords()) 378 | local scale = 0.3 379 | if onScreen then 380 | SetTextScale(scale, scale) 381 | SetTextFont(4) 382 | SetTextProportional(1) 383 | SetTextColour(255, 255, 255, 215) 384 | SetTextDropshadow(0) 385 | SetTextEntry("STRING") 386 | SetTextCentre(1) 387 | AddTextComponentString(text) 388 | DrawText(_x,_y) 389 | local factor = (string.len(text)) / 380 390 | DrawRect(_x, _y + 0.0120, 0.0 + factor, 0.025, 41, 11, 41, 100) 391 | end 392 | end 393 | --------------------------------------------------------------------------------