├── 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 | [](https://uyuyorumstore.com)
4 | [](https://www.buymeacoffee.com/umcof)
5 | [](https://choosealicense.com/licenses/mit/)
6 | [](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 |
25 |
26 | - {{lang.lastname}}{{item.targetlastname}}
27 | - {{lang.firstname}}{{item.targetname}}
28 | - {{lang.dob}}{{item.targetdob}}
29 | - {{lang.bankmoney}}{{item.targetbank}}
30 | - {{lang.number}} {{item.targetphone}}
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
{{item.trackerid}}
42 |
43 |
44 |
45 | - {{lang.plate}} {{item.vehicleinfoplate}}
46 | - {{lang.model}} {{item.vehicleinfoname}}
47 | - {{lang.engine}}{{item.vehicleinfoengine}}
48 |
49 |
50 |
51 |
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 |
--------------------------------------------------------------------------------