diff --git a/ND_Banks/fxmanifest.lua b/ND_Banks/fxmanifest.lua new file mode 100644 index 0000000..ee1cdd1 --- /dev/null +++ b/ND_Banks/fxmanifest.lua @@ -0,0 +1,20 @@ +-- For support join my discord: https://discord.gg/Z9Mxu72zZ6 + +author "Andyyy#7666" +description "ND Framework Banks" +version "2.0.0" + +fx_version "cerulean" +game "gta5" +lua54 "yes" + +ui_page "source/ui/index.html" + +files { + "source/ui/index.html", + "source/ui/script.js", + "source/ui/style.css" +} + +server_script "source/server.lua" +client_script "source/client.lua" \ No newline at end of file diff --git a/ND_Banks/source/client.lua b/ND_Banks/source/client.lua new file mode 100644 index 0000000..c6141c9 --- /dev/null +++ b/ND_Banks/source/client.lua @@ -0,0 +1,153 @@ +-- For support join my discord: https://discord.gg/Z9Mxu72zZ6 + +local display = false +local nearModel = false + +local banks = { + vector3(1175.77, 2706.89, 38.09), + vector3(149.23, -1040.57, 29.36), + vector3(-2962.53, 482.25, 15.69), + vector3(-112.02, 6469.13, 31.62), + vector3(-351.56, -49.70, 49.02), + vector3(313.66, -278.90, 54.16), + vector3(-1213.08, -330.93, 37.77) +} + +local days = { + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday" +} + +-- Get the time +function getTime() + local hours = GetClockHours() + local minutes = GetClockMinutes() + if hours <= 9 then + hours = "0" .. hours + end + if minutes <= 9 then + minutes = "0" .. minutes + end + return hours .. ":" .. minutes +end + +-- Hide/Show ui +function SetDisplay(bool) + local playerInfo = exports["ND_Core"]:getCharacterInfo() + display = bool + SetNuiFocus(bool, bool) + SendNUIMessage({ + status = bool, + playerName = playerInfo.firstName .. " " .. playerInfo.lastName, + balance = "Account Balance: $" .. playerInfo.bank .. ".00", + date = days[GetClockDayOfWeek() + 1], + time = getTime() + }) +end + +function drawText3D(coords, text) + local onScreen, _x, _y = World3dToScreen2d(coords.x, coords.y, coords.z + 0.3) + local pX, pY, pZ = table.unpack(GetGameplayCamCoords()) + SetTextScale(0.4, 0.4) + SetTextFont(4) + SetTextProportional(1) + SetTextEntry("STRING") + SetTextCentre(true) + SetTextColour(255, 255, 255, 255) + SetTextOutline() + AddTextComponentString(text) + DrawText(_x, _y) +end + +-- check if ped is close to a bank coordinate. +function inRange(ped) + playerCoords = GetEntityCoords(ped) + for _, bank in pairs(banks) do + if (#(playerCoords - bank)) < 1.5 then + return bank + end + end + return false +end + +Citizen.CreateThread(function() + while true do + Citizen.Wait(500) + ped = PlayerPedId() + nearModel = inRange(ped) + end +end) + +Citizen.CreateThread(function() + while true do + Citizen.Wait(0) + if not display and nearModel then + drawText3D(nearModel, "~w~Press ~g~E ~w~to use the bank") + if IsControlJustPressed(0, 51) then + SetDisplay(true) + TriggerScreenblurFadeIn(1000) + end + end + end +end) + +-- close the ui. +RegisterNUICallback("close", function(data) + PlaySoundFrontend(-1, "PIN_BUTTON", "ATM_SOUNDS", 1) + SetDisplay(false) + TriggerScreenblurFadeOut(1000) +end) + +-- makes a button sount for when the ui is clicked. +RegisterNUICallback("sound", function(data) + PlaySoundFrontend(-1, "PIN_BUTTON", "ATM_SOUNDS", 1) +end) + +-- deposit/withdraw +RegisterNUICallback("useATM", function(data) + local action = string.gsub(data.action, " ", "") + if action == "WITHDRAW" then + if data.amount == "" then + Citizen.Wait(1000) + SendNUIMessage({ + success = false + }) + return + end + TriggerServerEvent("ND_Banks:withdraw", data.amount) + elseif action == "DEPOSIT" then + if data.amount == "" then + Citizen.Wait(1000) + SendNUIMessage({ + success = false + }) + return + end + TriggerServerEvent("ND_Banks:deposit", data.amount) + elseif action == "TRANSFER" then + if data.transferAmount == "" or data.transferTarget == "" then + Citizen.Wait(1000) + SendNUIMessage({ + success = false + }) + return + end + TriggerServerEvent("ND_Banks:transfer", data.transferAmount, data.transferTarget) + end +end) + +-- update the balance on the ui and confirm if the deposit/withdraw was successful. +RegisterNetEvent("ND_Banks:update") +AddEventHandler("ND_Banks:update", function(status) + Citizen.Wait(1000) + local playerInfo = exports["ND_Core"]:getCharacterInfo() + SendNUIMessage({ + balance = "Account Balance: $" .. playerInfo.bank .. ".00", + success = status + }) +end) \ No newline at end of file diff --git a/ND_Banks/source/server.lua b/ND_Banks/source/server.lua new file mode 100644 index 0000000..e1c0eaf --- /dev/null +++ b/ND_Banks/source/server.lua @@ -0,0 +1,20 @@ +RegisterNetEvent("ND_Banks:withdraw") +AddEventHandler("ND_Banks:withdraw", function(amount) + local player = source + local update = exports["ND_Core"]:withdrawMoney(amount, player) + TriggerClientEvent("ND_Banks:update", player, update) +end) + +RegisterNetEvent("ND_Banks:deposit") +AddEventHandler("ND_Banks:deposit", function(amount) + local player = source + local update = exports["ND_Core"]:depositMoney(amount, player) + TriggerClientEvent("ND_Banks:update", player, update) +end) + +RegisterNetEvent("ND_Banks:transfer") +AddEventHandler("ND_Banks:transfer", function(amount, target) + local player = source + local update = exports["ND_Core"]:transferBank(amount, player, target) + TriggerClientEvent("ND_Banks:update", player, update) +end) \ No newline at end of file diff --git a/ND_Banks/source/ui/index.html b/ND_Banks/source/ui/index.html new file mode 100644 index 0000000..4bbb15e --- /dev/null +++ b/ND_Banks/source/ui/index.html @@ -0,0 +1,46 @@ + + + + + + + + + +
+
+ +

+

+
+
+

Welcome back

+

+
+
+

+ + + + + + +
+
+
+

Are you sure you'd like to perform this action

+ + +
+
+

Success!

+ +
+
+

Failed!

+ +
+ +
+ + \ No newline at end of file diff --git a/ND_Banks/source/ui/script.js b/ND_Banks/source/ui/script.js new file mode 100644 index 0000000..1735543 --- /dev/null +++ b/ND_Banks/source/ui/script.js @@ -0,0 +1,136 @@ +$(function() { + function display(bool) { + if (bool) { + $("#overlay").show(); + } else { + $("#overlay").hide(); + } + } + function atmDisplay(bool) { + if (bool) { + $("#atm").show(); + $("#loader, #confirmationScreen, #successScreen, #failedScreen").hide(); + return; + } + $("#atm").hide(); + } + function loader(bool) { + if (bool) { + $("#loader").show(); + $("#atm, #confirmationScreen, #successScreen, #failedScreen").hide(); + return; + } + $("#loader").hide(); + } + function confirmationScreen(bool) { + if (bool) { + $("#confirmationScreen").show(); + $("#atm, #loader, #successScreen, #failedScreen").hide(); + return; + } + $("#confirmationScreen").hide(); + } + function successScreen(bool) { + if (bool) { + $("#successScreen").show() + $("#confirmationScreen, #atm, #loader, #failedScreen").hide(); + return; + } + $("#successScreen").hide(); + } + function failedScreen(bool) { + if (bool) { + $("#failedScreen").show() + $("#confirmationScreen, #atm, #loader, #successScreen").hide(); + return; + } + $("#failedScreen").hide(); + } + display(false); + atmDisplay(true); + loader(false); + confirmationScreen(false); + successScreen(false); + + const today = new Date(); + let action; + + window.addEventListener("message", function(event) { + const item = event.data; + $("#balance").text(item.balance); + if (item.status) { + display(true); + $("#playername").text(item.playerName); + $("#date").text(`${item.date}, ${today.toLocaleDateString("en-US", {year: "numeric", month: "long", day: "numeric"})}`); + $("#time").text(item.time); + } else if (item.status === false) { + display(false); + } + if (item.success) { + loader(false); + successScreen(true); + } else if (item.success === false) { + loader(false); + failedScreen(true); + } + }) + + $("button[type=submit]").click(function () { + action = $(this).text(); + }); + + $("#confirmButton").click(function() { + $.post(`https://${GetParentResourceName()}/sound`); + confirmationScreen(false); + loader(true); + $.post(`https://${GetParentResourceName()}/useATM`, JSON.stringify({ + action: action, + amount: $("#enteredAmount").val(), + transferAmount: $("#transferAmount").val(), + transferTarget: $("#transferTarget").val() + })); + $("#enteredAmount").val(""); + $("#transferAmount").val(""); + $("#transferTarget").val(""); + return false; + }) + + $("#cancelButton").click(function() { + $.post(`https://${GetParentResourceName()}/sound`); + confirmationScreen(false); + loader(true); + setTimeout(() => { + loader(false); + atmDisplay(true); + }, 300); + return false; + }) + + $("#atm").submit(function() { + $.post(`https://${GetParentResourceName()}/sound`); + atmDisplay(false); + loader(true); + setTimeout(() => { + loader(false); + confirmationScreen(true); + }, 300); + return false; + }) + + $(".mainMenuButton").click(function() { + $.post(`https://${GetParentResourceName()}/sound`); + successScreen(false); + failedScreen(false); + loader(true); + setTimeout(() => { + loader(false); + atmDisplay(true); + }, 300); + return false; + }) + + $("#closeButton").click(function() { + $.post(`https://${GetParentResourceName()}/close`); + return; + }) +}); \ No newline at end of file diff --git a/ND_Banks/source/ui/style.css b/ND_Banks/source/ui/style.css new file mode 100644 index 0000000..848506a --- /dev/null +++ b/ND_Banks/source/ui/style.css @@ -0,0 +1,237 @@ +body { + font-family: Arial, Helvetica, sans-serif; +} + +#overlay { + display: none; + position: absolute; + height: 60vh; + width: 50vw; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: auto; + border-radius: 10px; + background-image: linear-gradient(rgb(255, 255, 255), rgb(199, 199, 199)); + background-color: white; +} + +#logo { + position: absolute; + width: 200px; + top: 2vh; + left: 6vw; + margin: auto; +} + +#date { + position: absolute; + top: 3.5vh; + right: 6vw; + color: black; + font-size: 18px; +} + +#time { + position: absolute; + font-weight: 500; + top: -0.7vh; + right: 6vw; + color: black; + font-size: 30px; +} + +#balance { + position: absolute; + top: 23vh; + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;; + font-weight: 500; + left: 0; + right: 0; + margin: auto; + color: black; + font-size: 20px; + text-align: center; +} + +#confirmText { + position: absolute; + top: 26vh; + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;; + font-weight: 500; + left: 0; + right: 0; + margin: auto; + color: black; + font-size: 20px; + text-align: center; +} + +#greenline { + position: absolute; + height: 1vh; + width: 80%; + top: 9vh; + left: 0; + right: 0; + margin: auto; + background-color: green; + border-radius: 5px; + border: none; +} + +#greenbox { + position: absolute; + height: 5vh; + width: 80%; + top: 11vh; + left: 0; + right: 0; + margin: auto; + background-color: green; + background-image: linear-gradient(rgb(2, 110, 2), green); + border-radius: 5px; + border: none; +} + +#playername { + position: absolute; + top: 13vh; + left: 0; + right: 0; + margin: auto; + color: white; + text-align: center; +} + +#welcome { + position: absolute; + top: 11.5vh; + left: 0; + right: 0; + margin: auto; + color: white; + text-align: center; +} + +.input { + height: 4vh; + width: 7.3vw; + background-color: green; + font-weight: 1000; + color: white; + border: none; + border-radius: 5px; + margin: auto; + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;; + transition: 50ms; +} + +.input:hover { + transition: 50ms; + background-color: rgb(2, 110, 2); +} + + +#transferAmount { + position: absolute; + width: 12vw; + top: 28vh; + right: 22.55%; + color: black; + background-color: white; + text-align: center; +} +#transferTarget { + position: absolute; + width: 3vw; + top: 28vh; + right: 15%; + color: black; + background-color: white; + text-align: center; +} +#transferButton { + position: absolute; + width: 15.8vw; + top: 36.5vh; + right: 15%; +} + +#enteredAmount { + position: absolute; + width: 15.8vw; + top: 28vh; + left: 15%; + color: black; + background-color: white; + text-align: center; +} + +#withdrawButton { + position: absolute; + top: 36.5vh; + left: 15%; +} + +#depositButton { + position: absolute; + top: 36.5vh; + left: 32%; +} + +.mainMenuButton { + position: absolute; + width: 10vw; + top: 34vh; + right: 0; + left: 0; + margin: auto; +} + +#closeButton { + position: absolute; + height: 4.8vh; + width: 80%; + top: 50vh; + left: 0; + right: 0; +} + +#confirmButton{ + position: absolute; + top: 33vh; + left: 17vw; +} + +#cancelButton { + position: absolute; + top: 33vh; + right: 17vw; +} + +#confirmationScreen { + display: none; +} + +#loader { + display: none; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + margin: auto; + border: 16px solid #d1d1d1; + border-radius: 50%; + border-top: 16px solid green; + width: 120px; + height: 120px; + animation: spin 1s linear infinite; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} \ No newline at end of file