├── nui ├── assets │ ├── img │ │ └── bg.png │ ├── sounds │ │ └── button-hover.mp3 │ ├── js │ │ └── app.js │ └── css │ │ └── style.css └── ui.html ├── shared_items ├── images │ ├── tracker.png │ ├── centralchip.png │ └── hackerphone.png └── items.lua ├── fxmanifest.lua ├── .github └── FUNDING.yml ├── LICENSE ├── README.md ├── client ├── anim.lua └── client.lua ├── server └── server.lua └── config.js /nui/assets/img/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alp1x/um-hackerphone/HEAD/nui/assets/img/bg.png -------------------------------------------------------------------------------- /shared_items/images/tracker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alp1x/um-hackerphone/HEAD/shared_items/images/tracker.png -------------------------------------------------------------------------------- /nui/assets/sounds/button-hover.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alp1x/um-hackerphone/HEAD/nui/assets/sounds/button-hover.mp3 -------------------------------------------------------------------------------- /shared_items/images/centralchip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alp1x/um-hackerphone/HEAD/shared_items/images/centralchip.png -------------------------------------------------------------------------------- /shared_items/images/hackerphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alp1x/um-hackerphone/HEAD/shared_items/images/hackerphone.png -------------------------------------------------------------------------------- /fxmanifest.lua: -------------------------------------------------------------------------------- 1 | fx_version 'cerulean' 2 | game 'gta5' 3 | 4 | author 'uyuyorum' 5 | description 'UM - Hacker Phone' 6 | version '2.0.0' 7 | ui_page 'nui/ui.html' 8 | 9 | files { 10 | 'config.js', 11 | 'nui/ui.html', 12 | 'nui/assets/img/*.png', 13 | 'nui/assets/css/*.css', 14 | 'nui/assets/js/*.js', 15 | 'nui/assets/sounds/*.mp3' 16 | } 17 | 18 | client_scripts {'client/anim.lua','client/client.lua'} 19 | server_script 'server/server.lua' 20 | 21 | lua54 'yes' 22 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 13 | custom: ['www.buymeacoffee.com/umcof'] 14 | -------------------------------------------------------------------------------- /shared_items/items.lua: -------------------------------------------------------------------------------- 1 | ['hackerphone'] = {['name'] = 'hackerphone', ['label'] = 'root@hackerphone', ['weight'] = 2000, ['type'] = 'item', ['image'] = 'hackerphone.png', ['unique'] = true, ['useable'] = true, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = ""}, 2 | ["centralchip"] = {["name"] = "centralchip", ["label"] = "Central Chip", ["weight"] = 1000, ["type"] = "item", ["image"] = "centralchip.png", ["unique"] = true, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""}, 3 | ["tracker"] = {["name"] = "tracker", ["label"] = "Tracker", ["weight"] = 1000, ["type"] = "item", ["image"] = "tracker.png", ["unique"] = true, ["useable"] = true, ["shouldClose"] = true, ["combinable"] = nil, ["description"] = ""}, 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 uyuyorum {um} 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # um-hackerphone 2 | 3 | [![umstore](https://cdn.discordapp.com/attachments/715130970294059088/1044857362617470986/Baslksz-3.png)](https://uyuyorumstore.com) 4 | [![Donate](https://cdn.discordapp.com/attachments/715130970294059088/1044848075996405820/coffee.png)](https://www.buymeacoffee.com/umcof) 5 | [![License MIT](https://cdn.discordapp.com/attachments/715130970294059088/1044845854508449822/license.png)](https://choosealicense.com/licenses/mit/) 6 | [![Discord](https://cdn.discordapp.com/attachments/715130970294059088/1044855172494532628/discord.png)](https://discord.gg/cf6wkBFeYV) 7 | 8 | 9 | Hacker Phone you can use for **[qb-core](https://github.com/qbcore-framework/qb-core)** 10 | 11 |

12 | 13 |

14 | 15 | 16 | ## Features V2 17 | + User Information 18 | + Vehicle Tracking 19 | + Blackout 20 | + Security Cams 21 | + Terminal (soon) 22 | + Vue.js 23 | + [Video Preview](https://www.youtube.com/watch?v=RuDvjsSow4A) 24 | 25 | 26 | 27 | ## Requirements 28 | + [qb-core](https://github.com/qbcore-framework/qb-core) 29 | + [ps-ui](https://github.com/Project-Sloth/ps-ui) 30 | 31 | 32 | 33 | ## License 34 | [MIT](https://choosealicense.com/licenses/mit/) 35 | -------------------------------------------------------------------------------- /client/anim.lua: -------------------------------------------------------------------------------- 1 | local phoneProp = 0 2 | local phoneModel = `prop_npc_phone_02` 3 | 4 | local function LoadAnimation(dict) 5 | RequestAnimDict(dict) 6 | while not HasAnimDictLoaded(dict) do 7 | Wait(1) 8 | end 9 | end 10 | 11 | local function CheckAnimLoopHacker() 12 | CreateThread(function() 13 | while lib ~= nil and libanim ~= nil do 14 | local ped = PlayerPedId() 15 | if not IsEntityPlayingAnim(ped, lib, libanim, 3) then 16 | LoadAnimation(lib) 17 | TaskPlayAnim(ped, lib, libanim, 3.0, 3.0, -1, 50, 0, false, false, false) 18 | end 19 | Wait(500) 20 | end 21 | end) 22 | end 23 | 24 | function newPhonePropHacker() 25 | deletePhoneHacker() 26 | RequestModel(phoneModel) 27 | while not HasModelLoaded(phoneModel) do 28 | Wait(1) 29 | end 30 | phoneProp = CreateObject(phoneModel, 1.0, 1.0, 1.0, 1, 1, 0) 31 | 32 | local bone = GetPedBoneIndex(PlayerPedId(), 28422) 33 | if phoneModel == `prop_cs_phone_01` then 34 | AttachEntityToEntity(phoneProp, PlayerPedId(), bone, 0.0, 0.0, 0.0, 50.0, 320.0, 50.0, 1, 1, 0, 0, 2, 1) 35 | else 36 | AttachEntityToEntity(phoneProp, PlayerPedId(), bone, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1, 1, 0, 0, 2, 1) 37 | end 38 | end 39 | 40 | function deletePhoneHacker() 41 | if phoneProp ~= 0 then 42 | DeleteObject(phoneProp) 43 | phoneProp = 0 44 | end 45 | end 46 | 47 | function DoPhoneAnimationHacker(anim) 48 | local ped = PlayerPedId() 49 | local AnimationLib = 'cellphone@' 50 | local AnimationStatus = anim 51 | if IsPedInAnyVehicle(ped, false) then 52 | AnimationLib = 'anim@cellphone@in_car@ps' 53 | end 54 | LoadAnimation(AnimationLib) 55 | TaskPlayAnim(ped, AnimationLib, AnimationStatus, 3.0, 3.0, -1, 50, 0, false, false, false) 56 | lib = AnimationLib 57 | libanim = AnimationStatus 58 | CheckAnimLoopHacker() 59 | end -------------------------------------------------------------------------------- /server/server.lua: -------------------------------------------------------------------------------- 1 | local QBCore = exports['qb-core']:GetCoreObject() 2 | 3 | QBCore.Functions.CreateUseableItem("hackerphone", function(source) 4 | local src = source 5 | local Player = QBCore.Functions.GetPlayer(src) 6 | local name = Player.PlayerData.charinfo.firstname 7 | TriggerClientEvent('um-hackerphone:client:openphone',src,name) 8 | end) 9 | 10 | QBCore.Functions.CreateUseableItem("tracker", function(source) 11 | TriggerClientEvent('um-hackerphone:client:vehicletracker',source) 12 | end) 13 | 14 | QBCore.Functions.CreateUseableItem("centralchip", function(source) 15 | TriggerClientEvent('um-hackerphone:client:centralchip',source) 16 | end) 17 | 18 | RegisterNetEvent('um-hackerphone:server:removeitem', function(item) 19 | local Player = QBCore.Functions.GetPlayer(source) 20 | Player.Functions.RemoveItem(item, 1) 21 | end) 22 | 23 | RegisterNetEvent('um-hackerphone:server:targetinformation', function() 24 | local src = source 25 | local PlayerPed = GetPlayerPed(src) 26 | local pCoords = GetEntityCoords(PlayerPed) 27 | local found = false 28 | for k, v in pairs(QBCore.Functions.GetPlayers()) do 29 | local TargetPed = GetPlayerPed(v) 30 | local tCoords = GetEntityCoords(TargetPed) 31 | local dist = #(pCoords - tCoords) 32 | if PlayerPed ~= TargetPed and dist < 3.0 then 33 | found = true 34 | TargetPlayer = QBCore.Functions.GetPlayer(v) 35 | end 36 | end 37 | if found then 38 | local targetinfo = { 39 | ['targetname'] = TargetPlayer.PlayerData.charinfo.firstname, 40 | ['targetlastname'] = TargetPlayer.PlayerData.charinfo.lastname, 41 | ['targetdob'] = TargetPlayer.PlayerData.charinfo.birthdate, 42 | ['targetphone'] = TargetPlayer.PlayerData.charinfo.phone, 43 | ['targetbank'] = TargetPlayer.PlayerData.money['bank'] 44 | } 45 | TriggerClientEvent('um-hackerphone:client:targetinfornui',src,targetinfo) 46 | else 47 | TriggerClientEvent('um-hackerphone:client:notify',src) 48 | end 49 | end) 50 | 51 | -------------------------------------------------------------------------------- /config.js: -------------------------------------------------------------------------------- 1 | UMHackerPhone = []; 2 | 3 | UMHackerPhone.CloseKey = "Escape" 4 | 5 | UMHackerPhone.BlackoutSeconds = 10 6 | 7 | UMHackerPhone.Cams = { 8 | [1] : "Pacific Bank CAM#1", 9 | [2] : "Pacific Bank CAM#2", 10 | [3] : "Pacific Bank CAM#3", 11 | [4] : "Limited Ltd Grove St. CAM#1", 12 | [5] : "Rob's Liqour Prosperity St. CAM#1", 13 | [6] : "Rob's Liqour San Andreas Ave. CAM#1", 14 | [7] : "Limited Ltd Ginger St. CAM#1", 15 | [8] : "24/7 Supermarkt Innocence Blvd. CAM#1", 16 | [9] : "Rob's Liqour El Rancho Blvd. CAM#1", 17 | [10] : "Limited Ltd West Mirror Drive CAM#1", 18 | [11] : "24/7 Supermarkt Clinton Ave CAM#1", 19 | [12] : "Limited Ltd Banham Canyon Dr CAM#1", 20 | [13] : "Rob's Liqour Great Ocean Hwy CAM#1", 21 | [14] : "24/7 Supermarkt Ineseno Road CAM#1", 22 | [15] : "24/7 Supermarkt Barbareno Rd. CAM#1", 23 | [16] : "24/7 Supermarkt Route 68 CAM#1", 24 | [17] : "Rob's Liqour Route 68 CAM#1", 25 | [18] : "24/7 Supermarkt Senora Fwy CAM#1", 26 | [19] : "24/7 Supermarkt Alhambra Dr. CAM#1", 27 | [20] : "24/7 Supermarkt Senora Fwy CAM#2", 28 | [21] : "Fleeca Bank Hawick Ave CAM#1", 29 | [22] : "Fleeca Bank Legion Square CAM#1", 30 | [23] : "Fleeca Bank Hawick Ave CAM#2", 31 | [24] : "Fleeca Bank Del Perro Blvd CAM#1", 32 | [25] : "Fleeca Bank Great Ocean Hwy CAM#1", 33 | [26] : "Paleto Bank CAM#1", 34 | [27] : "Del Vecchio Liquor Paleto Bay", 35 | [28] : "Don's Country Store Paleto Bay CAM#1", 36 | [29] : "Don's Country Store Paleto Bay CAM#2", 37 | [30] : "Don's Country Store Paleto Bay CAM#3", 38 | [31] : "Vangelico Jewelery CAM#1", 39 | [32] : "Vangelico Jewelery CAM#2", 40 | [33] : "Vangelico Jewelery CAM#3", 41 | [34] : "Vangelico Jewelery CAM#4", 42 | }, 43 | 44 | UMHackerPhone.Lang = { 45 | lastname: "Lastname:", 46 | firstname: "Firstname:", 47 | dob: "Birthday:", 48 | bankmoney: "Bank Money:", 49 | number: "P.Number:", 50 | blackout: "Blackout", 51 | userinfo: "User Information", 52 | vehicle: "Vehicle", 53 | vehicletrack: "Vehicle Tracking", 54 | blackout: "Blackout", 55 | plate: "Plate: ", 56 | model: "Model: ", 57 | engine: "Engine: ", 58 | securitycams: "Security Cams", 59 | botnet: "Terminal", 60 | refresh: "Refresh", 61 | delete: "Delete", 62 | disabletracker: "Disable Tracker", 63 | explosion: "Explosion", 64 | hackpower: "Hack power station", 65 | fixpower: "Fix power station Seconds: ", 66 | } -------------------------------------------------------------------------------- /client/client.lua: -------------------------------------------------------------------------------- 1 | local QBCore = exports['qb-core']:GetCoreObject() 2 | local UMHackerPhoneStatus = false 3 | 4 | CreateThread(function() 5 | while true do 6 | local sleep = 500 7 | if UMHackerPhoneStatus then 8 | sleep = 5 9 | DisableControlAction(0, 1, true) -- disable mouse look 10 | DisableControlAction(0, 2, true) -- disable mouse look 11 | DisableControlAction(0, 3, true) -- disable mouse look 12 | DisableControlAction(0, 4, true) -- disable mouse look 13 | DisableControlAction(0, 5, true) -- disable mouse look 14 | DisableControlAction(0, 6, true) -- disable mouse look 15 | DisableControlAction(0, 263, true) -- disable melee 16 | DisableControlAction(0, 264, true) -- disable melee 17 | DisableControlAction(0, 257, true) -- disable melee 18 | DisableControlAction(0, 140, true) -- disable melee 19 | DisableControlAction(0, 141, true) -- disable melee 20 | DisableControlAction(0, 142, true) -- disable melee 21 | DisableControlAction(0, 143, true) -- disable melee 22 | DisableControlAction(0, 177, true) -- disable escape 23 | DisableControlAction(0, 200, true) -- disable escape 24 | DisableControlAction(0, 202, true) -- disable escape 25 | DisableControlAction(0, 322, true) -- disable escape 26 | DisableControlAction(0, 245, true) -- disable chat 27 | DisableControlAction(0, 24, true) -- disable 28 | end 29 | Wait(sleep) 30 | end 31 | end) 32 | 33 | RegisterNetEvent("um-hackerphone:client:openphone",function(name) 34 | if not UMHackerPhoneStatus then 35 | SetNuiFocusKeepInput(true) 36 | SetNuiFocus(true,true) 37 | SendNUIMessage({nuimessage = 'open', name = name}) 38 | DoPhoneAnimationHacker('cellphone_text_in') 39 | Wait(250) 40 | newPhonePropHacker() 41 | UMHackerPhoneStatus = true 42 | end 43 | end) 44 | 45 | RegisterNetEvent("um-hackerphone:client:targetinfornui", function(targetinfo) 46 | SendNUIMessage({nuimessage = "userlists", uinfo = targetinfo}) 47 | end) 48 | 49 | RegisterNetEvent("um-hackerphone:client:centralchip", function() 50 | local ped = PlayerPedId() 51 | local pos = GetEntityCoords(ped) 52 | local chipcoords = vec3(2810.22, 1489.86, 24.73) 53 | local dist = #(pos - chipcoords) 54 | if dist < 2 then 55 | Anim() 56 | exports['ps-ui']:Scrambler(function(success) 57 | if success then 58 | SendNUIMessage({nuimessage = "cbool"}) 59 | ClearPedTasks(ped) 60 | QBCore.Functions.Notify('Central cart connected', "success") 61 | TriggerServerEvent('um-hackerphone:server:removeitem',"centralchip") 62 | else 63 | ClearPedTasks(ped) 64 | QBCore.Functions.Notify('Failed to connect', "error") 65 | end 66 | end, "numeric", 30, 2) 67 | else 68 | QBCore.Functions.Notify('Not near power station', "error") 69 | end 70 | end) 71 | 72 | RegisterNetEvent("um-hackerphone:client:vehicletracker", function() 73 | local vehicle = QBCore.Functions.GetClosestVehicle() 74 | if vehicle ~= nil and vehicle ~= 0 then 75 | local ped = PlayerPedId() 76 | local pos = GetEntityCoords(ped) 77 | local vehpos = GetEntityCoords(vehicle) 78 | local vehicleinfo = { 79 | ["plate"] = QBCore.Functions.GetPlate(vehicle), 80 | ["vehname"] = GetDisplayNameFromVehicleModel(GetEntityModel(vehicle)):lower(), 81 | ["vehengine"] = GetVehicleEngineHealth(vehicle), 82 | ["vehicle"] = vehicle 83 | } 84 | if #(pos - vehpos) < 2 then 85 | Anim() 86 | exports['ps-ui']:Circle(function(success) 87 | if success then 88 | SendNUIMessage({nuimessage = 'vbool', vehicleinfo = vehicleinfo}) 89 | ClearPedTasks(ped) 90 | QBCore.Functions.Notify('Tracker connected to vehicle', "success") 91 | TriggerServerEvent('um-hackerphone:server:removeitem',"tracker") 92 | else 93 | ClearPedTasks(ped) 94 | QBCore.Functions.Notify('Failed to connect', "error") 95 | end 96 | end, 5, 10) 97 | else 98 | QBCore.Functions.Notify('No cars nearby', "error") 99 | end 100 | end 101 | end) 102 | 103 | RegisterNetEvent("um-hackerphone:client:notify", function() 104 | SendNUIMessage({nuimessage = 'error'}) 105 | end) 106 | 107 | RegisterNUICallback("um-hackerphone:nuicallback:targetinformation", function() 108 | TriggerServerEvent('um-hackerphone:server:targetinformation') 109 | end) 110 | 111 | RegisterNUICallback("um-hackerphone:broken:vehicle", function(vehicle) 112 | local vehpos = GetEntityCoords(vehicle) 113 | AddExplosion(vehpos.x, vehpos.y, vehpos.z, 7, 0.5, true, false, true) 114 | end) 115 | 116 | RegisterNUICallback('um-hackerphone:nuicallback:blackout', function() 117 | TriggerServerEvent('qb-weathersync:server:toggleBlackout') 118 | end) 119 | 120 | RegisterNUICallback("um-hackerphone:nuicallback:cam", function(camid) 121 | TriggerEvent("police:client:ActiveCamera", tonumber(camid)) 122 | end) 123 | 124 | RegisterNUICallback("um-hackerphone:nuicallback:escape", function() 125 | SetNuiFocusKeepInput(false) 126 | SetNuiFocus(false,false) 127 | DoPhoneAnimationHacker('cellphone_text_out') 128 | Wait(400) 129 | StopAnimTask(PlayerPedId(), lib, libanim, 2.5) 130 | deletePhoneHacker() 131 | lib = nil 132 | libanim = nil 133 | UMHackerPhoneStatus = false 134 | end) 135 | 136 | function Anim() 137 | while not HasAnimDictLoaded("anim@amb@clubhouse@tutorial@bkr_tut_ig3@") do 138 | RequestAnimDict("anim@amb@clubhouse@tutorial@bkr_tut_ig3@") 139 | Wait(5) 140 | end 141 | TaskPlayAnim(PlayerPedId(), 'anim@amb@clubhouse@tutorial@bkr_tut_ig3@', 'machinic_loop_mechandplayer' , 3.0, 3.0, -1, 1, 0, false, false, false) 142 | end -------------------------------------------------------------------------------- /nui/assets/js/app.js: -------------------------------------------------------------------------------- 1 | const hackerphone = Vue.createApp({ 2 | data() { 3 | return { 4 | lang: UMHackerPhone.Lang, 5 | cams: UMHackerPhone.Cams, 6 | carlists: [], 7 | userlists: [], 8 | togglephone: false, 9 | togglelock: false, 10 | phoneanim: false, 11 | vbool: false, 12 | vpage: false, 13 | upage: false, 14 | ubool: false, 15 | cbool: false, 16 | cpage: false, 17 | cambool: true, 18 | campage: true, 19 | hackblackout: false, 20 | timer: UMHackerPhone.BlackoutSeconds, 21 | interval: null, 22 | timerready : false, 23 | error: false, 24 | title: "", 25 | erroricon : "", 26 | name: "", 27 | } 28 | }, 29 | methods: { 30 | eventHandler: function(e) { 31 | const d = e.data 32 | switch(d.nuimessage) { 33 | case "open": 34 | this.pageReset() 35 | this.error = false 36 | this.phoneanim = true 37 | this.togglephone = true 38 | this.title = `~$ root@${d.name} welcome!` 39 | // this.textSpeech(`welcome ${d.name} how are you today?`) 40 | this.name = d.name 41 | break; 42 | case "userlists": 43 | this.error = false 44 | this.title = `~$ root@${this.name} Target Phone connected!` 45 | this.ubool = true 46 | this.upage = true 47 | this.userlists.push({targetname: d.uinfo.targetname, targetlastname: d.uinfo.targetlastname, targetdob: d.uinfo.targetdob, targetphone: d.uinfo.targetphone, targetbank: Math.floor(d.uinfo.targetbank)}); 48 | break; 49 | case "vbool": 50 | this.vbool = true 51 | this.carlists.push({trackerid: 'Tracker - ' + d.vehicleinfo.vehicle, vehicleinfoplate: d.vehicleinfo.plate, vehicleinfoname: d.vehicleinfo.vehname, vehicleinfoengine: d.vehicleinfo.vehengine, vehicle: d.vehicleinfo.vehicle}); 52 | break; 53 | case "cbool": 54 | this.cbool = true 55 | break; 56 | case "error": 57 | this.error = true 58 | this.title = `~$ root@${this.name} 602 Target Phone not found` 59 | this.erroricon = "fa-mobile-screen" 60 | this.pageReset() 61 | break; 62 | } 63 | }, 64 | postMessage: function(url,data) { 65 | fetch(`https://${GetParentResourceName()}/${url}`, { 66 | method: "POST", 67 | headers: { "Content-Type": "application/json" }, 68 | body: JSON.stringify(data) 69 | }) 70 | }, 71 | pageCheck: function(variable,tvariable,page,icon) { 72 | if (this[variable]) { 73 | this.error = false 74 | this.title = `~$ root@${this.name} ${page} connected!` 75 | this.pageReset(tvariable) 76 | } else { 77 | this.error = true 78 | this.title = `~$ root@${this.name} 602 ${page} not found` 79 | this.erroricon = icon 80 | this.pageReset(tvariable) 81 | } 82 | }, 83 | generalButton: function(task,id) { 84 | const x = document.getElementById(id); 85 | if (task === "toggle") { 86 | if (x.style.display === "none") { 87 | x.style.display = "block"; 88 | } else { 89 | x.style.display = "none"; 90 | } 91 | }else if (task === "delete") { 92 | x.remove() 93 | } 94 | }, 95 | blackoutButton: function(post) { 96 | this.hackblackout = true 97 | if (!this.timerready) { 98 | this.postMessage(post) 99 | this.timerready = true 100 | this.interval = setInterval(() => { 101 | if (this.timer === 0) { 102 | this.hackblackout = false 103 | this.timerready = false 104 | this.postMessage(post) 105 | this.timer = UMHackerPhone.BlackoutSeconds 106 | clearInterval(this.interval) 107 | } else { 108 | this.timer-- 109 | } 110 | }, 1000) 111 | } 112 | }, 113 | vehicleExplosion: function(post,key,id) { 114 | this.postMessage(post,key) 115 | this.generalButton('delete',id) 116 | }, 117 | playSound: function(data) { 118 | const audio = new Audio(`assets/sounds/${data}.mp3`) 119 | audio.volume = 0.2; 120 | audio.play(); 121 | }, 122 | pageReset: function(vari) { 123 | this.vpage = false 124 | this.cpage = false 125 | this.campage = false 126 | this.upage = false 127 | this[vari] = true 128 | }, 129 | // textSpeech: function(text) { 130 | // const message = new SpeechSynthesisUtterance(text); 131 | // message.lang = "en-US"; 132 | // const voices = speechSynthesis.getVoices().filter(voice => voice.lang === "en-US"); 133 | // message.voice = voices[0]; 134 | // speechSynthesis.speak(message); 135 | // }, 136 | keyupHandler: function(e) { 137 | if (e.key == UMHackerPhone.CloseKey) { 138 | this.phoneanim = false 139 | this.postMessage('um-hackerphone:nuicallback:escape') 140 | setTimeout(() => { 141 | this.togglephone = false; 142 | }, 500) 143 | } 144 | }, 145 | }, 146 | mounted(){ 147 | window.addEventListener('message',this.eventHandler); 148 | document.addEventListener('keyup', this.keyupHandler); 149 | }, 150 | beforeUnmount() { 151 | window.removeEventListener('message', this.eventHandler); 152 | document.removeEventListener('keyup', this.keyupHandler); 153 | }, 154 | }).mount('.main') -------------------------------------------------------------------------------- /nui/assets/css/style.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css"); 2 | @import url("https://fonts.googleapis.com/css2?family=Montserrat:wght@500;700;900&display=swap"); 3 | 4 | :root { 5 | --white: #fff; 6 | --black: #000; 7 | --maincolor: rgb(26, 255, 171); 8 | } 9 | 10 | body { 11 | font-family: Montserrat, sans-serif; 12 | font-size: 14px; 13 | height: 100vh; 14 | margin: 0px; 15 | overflow: hidden; 16 | position: absolute; 17 | top: 24vh; 18 | right: 1vh; 19 | user-select: none; 20 | } 21 | 22 | .custom::-webkit-scrollbar { 23 | display: none; 24 | } 25 | 26 | .erroricon { 27 | text-align: center; 28 | margin-top: 7vh; 29 | } 30 | 31 | .erroricon i { 32 | font-size: 8vh; 33 | color: var(--maincolor); 34 | } 35 | .phone-frame { 36 | background-color:var(--black); 37 | border-radius: 51px; 38 | box-shadow: rgba(0, 0, 0, 0.03) 0px 0.4px 1px, rgba(0, 0, 0, 0.05) 0px 1px 2.3px, rgba(0, 0, 0, 0.07) 0px 1.9px 4.4px, rgba(0, 0, 0, 0.09) 0px 3.4px 7.8px, rgba(0, 0, 0, 0.14) 0px 6.3px 14.6px, rgba(0, 0, 0, 0.25) 0px 15px 35px; 39 | width: 34.6vh; 40 | height: 68vh; 41 | padding: 0.4vh; 42 | } 43 | .phone-screen { 44 | align-items: center; 45 | background-color: var(--black); 46 | border-radius: 5vh; 47 | display: flex; 48 | flex-direction: column; 49 | height: 68vh; 50 | overflow: hidden; 51 | perspective: 460px; 52 | position: relative; 53 | width: 34.6vh; 54 | } 55 | .imageContainer { 56 | overflow: hidden; 57 | transition: transform 300ms cubic-bezier(0.4, 0, 0.2, 1) 0s; 58 | width: 37vh; 59 | } 60 | .active .imageContainer { 61 | transform: rotateX(-45deg); 62 | } 63 | .image { 64 | left: -2.1vh; 65 | position: relative; 66 | width: 41vh; 67 | } 68 | .overlay { 69 | background: linear-gradient(rgba(0, 0, 0, 0.12) 0%, rgba(0, 0, 0, 0.624) 80%, rgba(0, 0, 0, 0.75) 100%); 70 | height: 100%; 71 | opacity: 0; 72 | position: absolute; 73 | transition: opacity 300ms cubic-bezier(0.4, 0, 0.2, 1) 0s; 74 | top: 0px; 75 | width: 100%; 76 | } 77 | .active .overlay { 78 | opacity: 1; 79 | } 80 | .button-menu { 81 | border-radius: 50%; 82 | position: absolute; 83 | transition: transform 300ms cubic-bezier(0.4, 0, 0.2, 1) 0s; 84 | } 85 | .button-menu1 { 86 | bottom: 3vh; 87 | cursor: pointer; 88 | fill: none; 89 | height: 1vh; 90 | border-radius: 1vh; 91 | text-align: center; 92 | background: var(--white); 93 | -webkit-tap-highlight-color: transparent; 94 | width: 11vh; 95 | } 96 | .button-menu1 i { 97 | color: var(--white); 98 | letter-spacing: 0px; 99 | margin-top: 0.7vh; 100 | font-size: 2vh; 101 | } 102 | .bg { 103 | fill: rgb(40, 40, 40); 104 | } 105 | .button-menu1:active .bg { 106 | fill: rgb(85, 85, 85); 107 | } 108 | .line { 109 | stroke: var(--white); 110 | stroke-width: 2; 111 | transition: stroke 300ms cubic-bezier(0.4, 0, 0.2, 1) 0s, transform 300ms cubic-bezier(0.4, 0, 0.2, 1) 0s; 112 | transform-origin: 50% center; 113 | } 114 | .active .line1 { 115 | stroke: var(--maincolor); 116 | transform: translateX(-2.5px) translateY(3px) rotate(45deg); 117 | } 118 | .active .line2 { 119 | stroke: var(--maincolor); 120 | transform: scale(0); 121 | } 122 | .active .line3 { 123 | stroke:var(--maincolor); 124 | transform: translateX(-2.5px) translateY(-3px) rotate(-45deg); 125 | } 126 | .active .button-menu { 127 | transform: translateY(-27vh); 128 | } 129 | .menu { 130 | background-blend-mode: screen; 131 | bottom: 0px; 132 | display: flex; 133 | flex-wrap: wrap; 134 | height: 27vh; 135 | position: absolute; 136 | transform: translateY(192vh); 137 | transition: transform 300ms cubic-bezier(0.4, 0, 0.2, 1) 0s; 138 | width: 37vh; 139 | } 140 | .option { 141 | align-items: center; 142 | border-top: 0.1vh solid var(--maincolor); 143 | box-sizing: border-box; 144 | cursor: pointer; 145 | display: flex; 146 | flex-direction: column; 147 | justify-content: center; 148 | position: relative; 149 | -webkit-tap-highlight-color: transparent; 150 | width: 12.2vh; 151 | text-align: center; 152 | background: #080808; 153 | } 154 | .option:hover { 155 | background: var(--black); 156 | transition: all .6s ease; 157 | } 158 | .option i { 159 | color: var(--maincolor); 160 | font-size: 2vh; 161 | } 162 | .food { 163 | height: 40px; 164 | width: 40px; 165 | } 166 | .active .menu { 167 | transform: translateY(0px); 168 | } 169 | .japanese { 170 | font-weight: 600; 171 | font-family: sans-serif; 172 | } 173 | .text { 174 | font-size: 1.1vh; 175 | color: var(--white); 176 | margin-top: 1.5vh; 177 | } 178 | .custom { 179 | margin-top: 10vh; 180 | overflow-y: scroll; 181 | max-height: 35vh; 182 | } 183 | div.custom p { 184 | color: var(--white); 185 | text-align: center; 186 | text-transform: uppercase; 187 | } 188 | #progress { 189 | color: var(--maincolor); 190 | font-size: 5vh; 191 | } 192 | .notify { 193 | text-align: center; 194 | color: var(--maincolor); 195 | font-size: 1.2vh; 196 | font-family: Inconsolata, monospace; 197 | text-shadow: rgba(0, 0, 0, 0.36) 0px 0px 1vh; 198 | animation: 10s steps(50) 0s 1 normal none running type, 0.8s ease 0s infinite normal none running caret-blink; 199 | border-right: 1vh solid var(--maincolor); 200 | overflow: hidden; 201 | margin: 0px; 202 | white-space: nowrap; 203 | } 204 | .list-item { 205 | text-align: center; 206 | color: var(--white); 207 | font-size: 1.3vh; 208 | font-family: Inconsolata, monospace; 209 | text-shadow: rgb(200, 200, 200) 0px 0px 1vh; 210 | } 211 | .list-item ul { 212 | list-style-type: none; 213 | text-align: left; 214 | font-size: 2.3vh; 215 | } 216 | .uyuyorumterminal { 217 | font-size: 1vh; 218 | text-align: center; 219 | color: var(--white); 220 | border-right: 1vh solid var(--maincolor); 221 | animation: 20s steps(50) 0s 1 normal none running type, 0.8s ease 0s infinite normal none running caret-blink; 222 | } 223 | @keyframes type { 224 | 0% { 225 | width: 0px; 226 | } 227 | 20% { 228 | width: 100%; 229 | } 230 | } 231 | @keyframes caret-blink { 232 | 0% { 233 | border-color: transparent; 234 | } 235 | 100% { 236 | border-color: var(--maincolor); 237 | } 238 | } 239 | 240 | 241 | .item { 242 | background: var(--maincolor); 243 | color: var(--black); 244 | padding: 1px; 245 | border-radius: 1.5vh; 246 | margin: 3vh; 247 | } 248 | 249 | button { 250 | padding: 1vh; 251 | margin: 1vh; 252 | background: var(--black); 253 | color: var(--white); 254 | font-weight: 600; 255 | } -------------------------------------------------------------------------------- /nui/ui.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | UM - Hacker Phone 5 | 6 | 7 | 8 | 9 | 10 |
11 |
12 |
13 |
14 | 15 |
16 |
{{title}}
17 |
18 |
19 |
20 |
21 |
22 |

{{item.targetlastname}} {{item.targetname}}

23 |
24 | 34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |

{{item.trackerid}}

42 |
43 | 52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |

{{lang.hackpower}}

60 |

{{lang.fixpower}} {{timer}}

61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |

{{value}}

70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 | 103 |
104 |
105 |
106 | 107 | 108 | 109 | --------------------------------------------------------------------------------