├── README.md ├── client ├── client.lua ├── colors.lua ├── commands.lua ├── utils.lua └── weapons.lua ├── config.lua ├── fxmanifest.lua ├── server └── server.lua └── ui ├── assets └── icons │ ├── clock.svg │ ├── distance.svg │ ├── gender.svg │ ├── location.svg │ ├── paint.svg │ ├── patch.svg │ ├── plate.svg │ ├── vehicle.svg │ └── weapon.svg ├── css ├── style.css ├── style.css.map └── style.scss ├── index.html ├── js └── main.js └── sounds └── beep.mp3 /README.md: -------------------------------------------------------------------------------- 1 | # For more information and help 2 | Join our Discord 3 | * https://discord.gg/eUDGHx5Kbt 4 | --- 5 | 6 | # Config 7 | ### Framework 8 | * qb or esx 9 | ### UseGPS and GPSItem 10 | * Use this if you want players to need a gps to dispatch 11 | * Item name of the gps 12 | ### SetWaypoingKey 13 | * Key for responding a disptach 14 | ### WaitTimes 15 | * Cooldown after a dispatch to send another one. 16 | ### Enable 17 | * Enable or disable built-in dispatches 18 | ### WhitelistedJobs 19 | * Jobs that won't going to give an alert. 20 | ### BlipRemoveTime 21 | * Time for blip to remove after a dispatch 22 | ### BlipRemoveTime 23 | * Weapons that wont give an alert 24 | -------------------------------------------------------------------------------- /client/client.lua: -------------------------------------------------------------------------------- 1 | Framework = Config.Framework == "esx" and exports['es_extended']:getSharedObject() or exports['qb-core']:GetCoreObject() 2 | PlayerData = {} 3 | blips = {} 4 | PlayerJob = "" 5 | latestDispatch = nil 6 | WaitTimes = { 7 | Shooting = 0, 8 | Speeding = 0, 9 | } 10 | 11 | CreateThread(function() 12 | while true do 13 | if Config.Framework == "esx" then 14 | PlayerData = Framework.GetPlayerData() 15 | if table_size(PlayerData) > 6 then 16 | PlayerJob = PlayerData.job.name 17 | end 18 | else 19 | PlayerData = Framework.Functions.GetPlayerData() 20 | if table_size(PlayerData) > 6 then 21 | PlayerJob = PlayerData.job.name 22 | end 23 | end 24 | 25 | for key, time in pairs(WaitTimes) do 26 | if WaitTimes[key] > 0 then 27 | WaitTimes[key] = WaitTimes[key] - 1 28 | end 29 | end 30 | 31 | for i, blip in pairs(blips) do 32 | if blip[2] > 0 then 33 | blip[2] = blip[2] - 1 34 | elseif blip[2] == 0 then 35 | RemoveBlip(blip[1]) 36 | table.remove(blips, i) 37 | end 38 | end 39 | 40 | Wait(1000) 41 | end 42 | end) 43 | 44 | CreateThread(function() 45 | while true do 46 | local sleep = 500 47 | local ped = PlayerPedId() 48 | 49 | if Config.Enable.Shooting then 50 | if IsPedArmed(ped, 4) then 51 | sleep = 5 52 | 53 | if IsPedShooting(ped) and WaitTimes.Shooting == 0 and not IsWeaponBlackListed(ped) then 54 | 55 | if Config.Enable.UseSuppressorControl and IsWeaponHasSuppressor(ped) then 56 | return 57 | end 58 | 59 | for k, jobs in pairs(Config.WhitelistedJobs) do 60 | if jobs == PlayerJob then 61 | return 62 | end 63 | end 64 | 65 | local coords = GetEntityCoords(ped) 66 | local streetHash, roadHash = GetStreetNameAtCoord(table.unpack(coords)) 67 | local location = { 68 | street = GetStreetNameFromHashKey(streetHash), 69 | road = GetStreetNameFromHashKey(roadHash) 70 | } 71 | local weaponHash = GetSelectedPedWeapon(ped) 72 | local weapon = Weapons[weaponHash].label 73 | local vehicle = GetVehiclePedIsIn(ped, 0) 74 | local vehicleName = GetDisplayNameFromVehicleModel(GetEntityModel(vehicle)) 75 | local gender 76 | 77 | if Config.Framework == "esx" then 78 | if PlayerData.sex == 1 then gender = "Female" else gender = "Male" end 79 | else 80 | if PlayerData.charinfo.gender == 1 then gender = "Female" else gender = "Male" end 81 | end 82 | 83 | ShootingDispatch(location, coords, gender, weapon, vehicleName, vehicle, {"police"}) 84 | WaitTimes.Shooting = Config.WaitTimes.Shooting 85 | end 86 | end 87 | end 88 | 89 | if Config.Enable.Speeding then 90 | if IsPedInAnyVehicle(ped, 0) then 91 | local vehicle = GetVehiclePedIsIn(ped, 0) 92 | 93 | Wait(100) 94 | 95 | if (GetEntitySpeed(vehicle) * 3.6) >= 120 and WaitTimes.Speeding == 0 then 96 | for k, jobs in pairs(Config.WhitelistedJobs) do 97 | if jobs == PlayerJob then 98 | return 99 | end 100 | end 101 | 102 | SendDispatch("Vehicle speeding!", "10-11", 227, {"police"}) 103 | WaitTimes.Speeding = Config.WaitTimes.Speeding 104 | end 105 | end 106 | end 107 | 108 | Wait(sleep) 109 | end 110 | end) 111 | 112 | AddEventHandler('gameEventTriggered', function(event, data) 113 | if event == "CEventNetworkEntityDamage" then 114 | local victim, attacker, victimDied, weapon = data[1], data[2], data[4], data[7] 115 | if not IsEntityAPed(victim) then return end 116 | if victimDied and NetworkGetPlayerIndexFromPed(victim) == PlayerId() and IsEntityDead(PlayerPedId()) then 117 | if not isDead then 118 | Wait(3000) 119 | 120 | for _, jobs in pairs(Config.WhitelistedJobs) do 121 | if PlayerJob == jobs and PlayerJob ~= "ambulance" then 122 | SendDispatch("Officer Down!", "10-11", 61, {"police", "ambulance"}) 123 | return 124 | else 125 | SendDispatch("Civilian Down!", "10-11", 61, {"police", "ambulance"}) 126 | return 127 | end 128 | end 129 | end 130 | end 131 | end 132 | end) 133 | 134 | RegisterNetEvent("aty_dispatch:client:shootingDispatch", function(title, code, location, coords, gender, weapon, vehicleName, vehicle) 135 | local distance = GetDistanceBetweenCoords(coords, GetEntityCoords(PlayerPedId()), false) 136 | local paint, primaryId, secondaryId, primary, secondary 137 | 138 | if vehicle ~= 0 then 139 | plate = GetVehicleNumberPlateText(vehicle) 140 | primaryId, secondaryId = GetVehicleColours(vehicle) 141 | primary = Colours[tostring(primaryId)] 142 | secondary = Colours[tostring(secondaryId)] 143 | end 144 | 145 | if vehicleName == "CARNOTFOUND" then 146 | vehicleName = nil 147 | plate = nil 148 | end 149 | 150 | table.insert(blips, {createBlip(coords.x, coords.y, coords.z, 110, 1, title, 1.0), Config.BlipRemoveTime}) 151 | 152 | latestDispatch = coords 153 | 154 | SendNUIMessage({ 155 | action = "dispatch", 156 | title = title, 157 | code = code, 158 | location = location, 159 | distance = distance, 160 | gender = gender, 161 | vehicle = vehicleName, 162 | plate = plate, 163 | primary = primary, 164 | secondary = secondary, 165 | weapon = weapon 166 | }) 167 | end) 168 | 169 | RegisterNetEvent("aty_dispatch:client:customDispatch", function(title, code, location, coords, gender, vehicleName, vehicle, weapon, blipSprite) 170 | local distance = GetDistanceBetweenCoords(coords, GetEntityCoords(PlayerPedId()), false) 171 | local paint, primaryId, secondaryId, primary, secondary 172 | 173 | if vehicle ~= 0 then 174 | plate = GetVehicleNumberPlateText(vehicle) 175 | primaryId, secondaryId = GetVehicleColours(vehicle) 176 | primary = Colours[tostring(primaryId)] 177 | secondary = Colours[tostring(secondaryId)] 178 | end 179 | 180 | if vehicleName == "CARNOTFOUND" then 181 | vehicleName = nil 182 | plate = nil 183 | end 184 | 185 | table.insert(blips, {createBlip(coords.x, coords.y, coords.z, blipSprite, 1, title, 1.0), Config.BlipRemoveTime}) 186 | 187 | latestDispatch = coords 188 | 189 | SendNUIMessage({ 190 | action = "dispatch", 191 | title = title, 192 | code = code, 193 | location = location, 194 | distance = distance, 195 | gender = gender, 196 | vehicle = vehicleName, 197 | plate = plate, 198 | primary = primary, 199 | secondary = secondary, 200 | weapon = weapon 201 | }) 202 | end) 203 | 204 | RegisterNUICallback("close", function() 205 | SetNuiFocus(0, 0) 206 | end) 207 | 208 | RegisterCommand('respondDispatch', function() 209 | if latestDispatch then 210 | SetWaypointOff() 211 | SetNewWaypoint(latestDispatch.x, latestDispatch.y) 212 | Config.Notification("Waypoint", "Waypoint Set.", "success", 5000) 213 | latestDispatch = nil 214 | end 215 | end) 216 | 217 | RegisterKeyMapping('respondDispatch', 'Respond To Latest Dispatch', 'keyboard', Config.SetWaypoingKey) -------------------------------------------------------------------------------- /client/colors.lua: -------------------------------------------------------------------------------- 1 | Colours = { 2 | ['0'] = "Metallic Black", 3 | ['1'] = "Metallic Graphite Black", 4 | ['2'] = "Metallic Black Steel", 5 | ['3'] = "Metallic Dark Silver", 6 | ['4'] = "Metallic Silver", 7 | ['5'] = "Metallic Blue Silver", 8 | ['6'] = "Metallic Steel Gray", 9 | ['7'] = "Metallic Shadow Silver", 10 | ['8'] = "Metallic Stone Silver", 11 | ['9'] = "Metallic Midnight Silver", 12 | ['10'] = "Metallic Gun Metal", 13 | ['11'] = "Metallic Anthracite Grey", 14 | ['12'] = "Matte Black", 15 | ['13'] = "Matte Gray", 16 | ['14'] = "Matte Light Grey", 17 | ['15'] = "Util Black", 18 | ['16'] = "Util Black Poly", 19 | ['17'] = "Util Dark silver", 20 | ['18'] = "Util Silver", 21 | ['19'] = "Util Gun Metal", 22 | ['20'] = "Util Shadow Silver", 23 | ['21'] = "Worn Black", 24 | ['22'] = "Worn Graphite", 25 | ['23'] = "Worn Silver Grey", 26 | ['24'] = "Worn Silver", 27 | ['25'] = "Worn Blue Silver", 28 | ['26'] = "Worn Shadow Silver", 29 | ['27'] = "Metallic Red", 30 | ['28'] = "Metallic Torino Red", 31 | ['29'] = "Metallic Formula Red", 32 | ['30'] = "Metallic Blaze Red", 33 | ['31'] = "Metallic Graceful Red", 34 | ['32'] = "Metallic Garnet Red", 35 | ['33'] = "Metallic Desert Red", 36 | ['34'] = "Metallic Cabernet Red", 37 | ['35'] = "Metallic Candy Red", 38 | ['36'] = "Metallic Sunrise Orange", 39 | ['37'] = "Metallic Classic Gold", 40 | ['38'] = "Metallic Orange", 41 | ['39'] = "Matte Red", 42 | ['40'] = "Matte Dark Red", 43 | ['41'] = "Matte Orange", 44 | ['42'] = "Matte Yellow", 45 | ['43'] = "Util Red", 46 | ['44'] = "Util Bright Red", 47 | ['45'] = "Util Garnet Red", 48 | ['46'] = "Worn Red", 49 | ['47'] = "Worn Golden Red", 50 | ['48'] = "Worn Dark Red", 51 | ['49'] = "Metallic Dark Green", 52 | ['50'] = "Metallic Racing Green", 53 | ['51'] = "Metallic Sea Green", 54 | ['52'] = "Metallic Olive Green", 55 | ['53'] = "Metallic Green", 56 | ['54'] = "Metallic Gasoline Blue Green", 57 | ['55'] = "Matte Lime Green", 58 | ['56'] = "Util Dark Green", 59 | ['57'] = "Util Green", 60 | ['58'] = "Worn Dark Green", 61 | ['59'] = "Worn Green", 62 | ['60'] = "Worn Sea Wash", 63 | ['61'] = "Metallic Midnight Blue", 64 | ['62'] = "Metallic Dark Blue", 65 | ['63'] = "Metallic Saxony Blue", 66 | ['64'] = "Metallic Blue", 67 | ['65'] = "Metallic Mariner Blue", 68 | ['66'] = "Metallic Harbor Blue", 69 | ['67'] = "Metallic Diamond Blue", 70 | ['68'] = "Metallic Surf Blue", 71 | ['69'] = "Metallic Nautical Blue", 72 | ['70'] = "Metallic Bright Blue", 73 | ['71'] = "Metallic Purple Blue", 74 | ['72'] = "Metallic Spinnaker Blue", 75 | ['73'] = "Metallic Ultra Blue", 76 | ['74'] = "Metallic Bright Blue", 77 | ['75'] = "Util Dark Blue", 78 | ['76'] = "Util Midnight Blue", 79 | ['77'] = "Util Blue", 80 | ['78'] = "Util Sea Foam Blue", 81 | ['79'] = "Uil Lightning blue", 82 | ['80'] = "Util Maui Blue Poly", 83 | ['81'] = "Util Bright Blue", 84 | ['82'] = "Matte Dark Blue", 85 | ['83'] = "Matte Blue", 86 | ['84'] = "Matte Midnight Blue", 87 | ['85'] = "Worn Dark blue", 88 | ['86'] = "Worn Blue", 89 | ['87'] = "Worn Light blue", 90 | ['88'] = "Metallic Taxi Yellow", 91 | ['89'] = "Metallic Race Yellow", 92 | ['90'] = "Metallic Bronze", 93 | ['91'] = "Metallic Yellow Bird", 94 | ['92'] = "Metallic Lime", 95 | ['93'] = "Metallic Champagne", 96 | ['94'] = "Metallic Pueblo Beige", 97 | ['95'] = "Metallic Dark Ivory", 98 | ['96'] = "Metallic Choco Brown", 99 | ['97'] = "Metallic Golden Brown", 100 | ['98'] = "Metallic Light Brown", 101 | ['99'] = "Metallic Straw Beige", 102 | ['100'] = "Metallic Moss Brown", 103 | ['101'] = "Metallic Biston Brown", 104 | ['102'] = "Metallic Beechwood", 105 | ['103'] = "Metallic Dark Beechwood", 106 | ['104'] = "Metallic Choco Orange", 107 | ['105'] = "Metallic Beach Sand", 108 | ['106'] = "Metallic Sun Bleeched Sand", 109 | ['107'] = "Metallic Cream", 110 | ['108'] = "Util Brown", 111 | ['109'] = "Util Medium Brown", 112 | ['110'] = "Util Light Brown", 113 | ['111'] = "Metallic White", 114 | ['112'] = "Metallic Frost White", 115 | ['113'] = "Worn Honey Beige", 116 | ['114'] = "Worn Brown", 117 | ['115'] = "Worn Dark Brown", 118 | ['116'] = "Worn straw beige", 119 | ['117'] = "Brushed Steel", 120 | ['118'] = "Brushed Black Steel", 121 | ['119'] = "Brushed Aluminium", 122 | ['120'] = "Chrome", 123 | ['121'] = "Worn Off White", 124 | ['122'] = "Util Off White", 125 | ['123'] = "Worn Orange", 126 | ['124'] = "Worn Light Orange", 127 | ['125'] = "Metallic Securicor Green", 128 | ['126'] = "Worn Taxi Yellow", 129 | ['127'] = "Police Car Blue", 130 | ['128'] = "Matte Green", 131 | ['129'] = "Matte Brown", 132 | ['130'] = "Worn Orange", 133 | ['131'] = "Matte White", 134 | ['132'] = "Worn White", 135 | ['133'] = "Worn Olive Army Green", 136 | ['134'] = "Pure White", 137 | ['135'] = "Hot Pink", 138 | ['136'] = "Salmon pink", 139 | ['137'] = "Metallic Vermillion Pink", 140 | ['138'] = "Orange", 141 | ['139'] = "Green", 142 | ['140'] = "Blue", 143 | ['141'] = "Mettalic Black Blue", 144 | ['142'] = "Metallic Black Purple", 145 | ['143'] = "Metallic Black Red", 146 | ['144'] = "hunter green", 147 | ['145'] = "Metallic Purple", 148 | ['146'] = "Metallic Dark Blue", 149 | ['147'] = "Black", 150 | ['148'] = "Matte Purple", 151 | ['149'] = "Matte Dark Purple", 152 | ['150'] = "Metallic Lava Red", 153 | ['151'] = "Matte Forest Green", 154 | ['152'] = "Matte Olive Drab", 155 | ['153'] = "Matte Desert Brown", 156 | ['154'] = "Matte Desert Tan", 157 | ['155'] = "Matte Foilage Green", 158 | ['156'] = "Default Alloy Color", 159 | ['157'] = "Epsilon Blue", 160 | ['158'] = "Pure Gold", 161 | ['159'] = "Brushed Gold", 162 | ['160'] = "MP100" 163 | } -------------------------------------------------------------------------------- /client/commands.lua: -------------------------------------------------------------------------------- 1 | RegisterCommand("911", function() 2 | SendDispatch("Citizen needs help!", "10-11", 61, {"police", "ambulance"}) 3 | end) 4 | 5 | RegisterCommand("help", function() 6 | SendDispatch("Citizen needs help!", "10-11", 61, {"police", "ambulance"}) 7 | end) 8 | 9 | RegisterCommand("showDispatch", function() 10 | for k, jobs in pairs(Config.WhitelistedJobs) do 11 | if PlayerJob == jobs then 12 | SendNUIMessage({ 13 | action = "showDispatch" 14 | }) 15 | 16 | SetNuiFocus(1, 1) 17 | return 18 | end 19 | end 20 | end) -------------------------------------------------------------------------------- /client/utils.lua: -------------------------------------------------------------------------------- 1 | function ShootingDispatch(location, coords, gender, weapon, vehicleName, vehicle, jobs) 2 | if vehicle ~= 0 then 3 | TriggerServerEvent("aty_dispatch:server:shootingDispatch", "Drive By In Progress", "10-60", location, coords, gender, weapon, vehicleName, vehicle, jobs) 4 | else 5 | TriggerServerEvent("aty_dispatch:server:shootingDispatch", "Shooting In Progress", "10-11", location, coords, gender, weapon, vehicleName, vehicle, jobs) 6 | end 7 | end 8 | 9 | function SendDispatch(title, code, blipSprite, jobs) 10 | local title = title or "Placeholder" 11 | local code = code or "10-11" 12 | local blipSprite = blipSprite or 1 13 | local ped = PlayerPedId() 14 | 15 | local coords = GetEntityCoords(ped) 16 | local streetHash, roadHash = GetStreetNameAtCoord(table.unpack(coords)) 17 | local location = { 18 | street = GetStreetNameFromHashKey(streetHash), 19 | road = GetStreetNameFromHashKey(roadHash) 20 | } 21 | local weaponHash = GetSelectedPedWeapon(ped) 22 | local weapon = Weapons[weaponHash].label 23 | local vehicle = GetVehiclePedIsIn(ped, 0) 24 | local vehicleName = GetDisplayNameFromVehicleModel(GetEntityModel(vehicle)) 25 | local gender 26 | 27 | if Config.Framework == "esx" then 28 | if PlayerData.sex == 1 then gender = "Female" else gender = "Male" end 29 | else 30 | if PlayerData.charinfo.gender == 1 then gender = "Female" else gender = "Male" end 31 | end 32 | 33 | TriggerServerEvent("aty_dispatch:server:customDispatch", title, code, location, coords, gender, vehicleName, vehicle, weapon, blipSprite, jobs) 34 | end 35 | 36 | RegisterNetEvent("aty_dispatch:SendDispatch", function(title, code, blipSprite, jobs) 37 | local title = title or "Placeholder" 38 | local code = code or "10-11" 39 | local blipSprite = blipSprite or 1 40 | local ped = PlayerPedId() 41 | 42 | local coords = GetEntityCoords(ped) 43 | local streetHash, roadHash = GetStreetNameAtCoord(table.unpack(coords)) 44 | local location = { 45 | street = GetStreetNameFromHashKey(streetHash), 46 | road = GetStreetNameFromHashKey(roadHash) 47 | } 48 | local weaponHash = GetSelectedPedWeapon(ped) 49 | local weapon = Weapons[weaponHash].label 50 | local vehicle = GetVehiclePedIsIn(ped, 0) 51 | local vehicleName = GetDisplayNameFromVehicleModel(GetEntityModel(vehicle)) 52 | local gender 53 | 54 | if Config.Framework == "esx" then 55 | if PlayerData.sex == 1 then gender = "Female" else gender = "Male" end 56 | else 57 | if PlayerData.charinfo.gender == 1 then gender = "Female" else gender = "Male" end 58 | end 59 | 60 | TriggerServerEvent("aty_dispatch:server:customDispatch", title, code, location, coords, gender, vehicleName, vehicle, weapon, blipSprite, jobs) 61 | end) 62 | 63 | function createBlip(x, y, z, sprite, color, text, size) 64 | local size = size or 1.0 65 | local blip = AddBlipForCoord(x, y, z) 66 | SetBlipSprite(blip, sprite) 67 | SetBlipDisplay(blip, 6) 68 | SetBlipScale(blip, size) 69 | SetBlipColour(blip, color) 70 | SetBlipAsShortRange(blip, true) 71 | BeginTextCommandSetBlipName("STRING") 72 | AddTextComponentString(text) 73 | EndTextCommandSetBlipName(blip) 74 | 75 | return blip 76 | end 77 | 78 | function IsWeaponBlackListed(ped) 79 | for i, weapon in pairs(Config.BlackListedWeapons) do 80 | local weaponHash = GetHashKey(Config.BlackListedWeapons[i]) 81 | 82 | if GetSelectedPedWeapon(ped) == weaponHash then 83 | return true 84 | end 85 | end 86 | 87 | Wait(10) 88 | 89 | return false 90 | end 91 | 92 | 93 | function IsWeaponHasSuppressor(ped) 94 | for _, hash in pairs(Config.Suppressors) do 95 | print(HasPedGotWeaponComponent(ped, GetSelectedPedWeapon(ped), hash)) 96 | if HasPedGotWeaponComponent(ped, GetSelectedPedWeapon(ped), hash) then 97 | return true 98 | end 99 | end 100 | 101 | Wait(10) 102 | 103 | return false 104 | end 105 | 106 | function table_size(tbl) 107 | local size = 0 108 | 109 | for k, v in pairs(tbl) do 110 | size = size + 1 111 | end 112 | 113 | return size 114 | end -------------------------------------------------------------------------------- /client/weapons.lua: -------------------------------------------------------------------------------- 1 | Weapons = { 2 | -- // WEAPONS 3 | -- Melee 4 | [`weapon_unarmed`] = { ['name'] = 'weapon_unarmed', ['label'] = 'Fists', ['weapontype'] = 'Melee', 5 | ['ammotype'] = nil, ['damagereason'] = 'Melee killed / Whacked / Executed / Beat down / Murdered / Battered' }, 6 | [`weapon_dagger`] = { ['name'] = 'weapon_dagger', ['label'] = 'Dagger', ['weapontype'] = 'Melee', 7 | ['ammotype'] = nil, ['damagereason'] = 'Knifed / Stabbed / Eviscerated' }, 8 | [`weapon_bat`] = { ['name'] = 'weapon_bat', ['label'] = 'Bat', ['weapontype'] = 'Melee', 9 | ['ammotype'] = nil, ['damagereason'] = 'Melee killed / Whacked / Executed / Beat down / Murdered / Battered' }, 10 | [`weapon_bottle`] = { ['name'] = 'weapon_bottle', ['label'] = 'Broken Bottle', ['weapontype'] = 'Melee', 11 | ['ammotype'] = nil, ['damagereason'] = 'Knifed / Stabbed / Eviscerated' }, 12 | [`weapon_crowbar`] = { ['name'] = 'weapon_crowbar', ['label'] = 'Crowbar', ['weapontype'] = 'Melee', 13 | ['ammotype'] = nil, ['damagereason'] = 'Melee killed / Whacked / Executed / Beat down / Murdered / Battered' }, 14 | [`weapon_flashlight`] = { ['name'] = 'weapon_flashlight', ['label'] = 'Flashlight', ['weapontype'] = 'Melee', 15 | ['ammotype'] = nil, ['damagereason'] = 'Melee killed / Whacked / Executed / Beat down / Murdered / Battered' }, 16 | [`weapon_golfclub`] = { ['name'] = 'weapon_golfclub', ['label'] = 'Golfclub', ['weapontype'] = 'Melee', 17 | ['ammotype'] = nil, ['damagereason'] = 'Melee killed / Whacked / Executed / Beat down / Murdered / Battered' }, 18 | [`weapon_hammer`] = { ['name'] = 'weapon_hammer', ['label'] = 'Hammer', ['weapontype'] = 'Melee', 19 | ['ammotype'] = nil, ['damagereason'] = 'Melee killed / Whacked / Executed / Beat down / Murdered / Battered' }, 20 | [`weapon_hatchet`] = { ['name'] = 'weapon_hatchet', ['label'] = 'Hatchet', ['weapontype'] = 'Melee', 21 | ['ammotype'] = nil, ['damagereason'] = 'Knifed / Stabbed / Eviscerated' }, 22 | [`weapon_knuckle`] = { ['name'] = 'weapon_knuckle', ['label'] = 'Knuckle', ['weapontype'] = 'Melee', 23 | ['ammotype'] = nil, ['damagereason'] = 'Melee killed / Whacked / Executed / Beat down / Murdered / Battered' }, 24 | [`weapon_knife`] = { ['name'] = 'weapon_knife', ['label'] = 'Knife', ['weapontype'] = 'Melee', 25 | ['ammotype'] = nil, ['damagereason'] = 'Knifed / Stabbed / Eviscerated' }, 26 | [`weapon_machete`] = { ['name'] = 'weapon_machete', ['label'] = 'Machete', ['weapontype'] = 'Melee', 27 | ['ammotype'] = nil, ['damagereason'] = 'Knifed / Stabbed / Eviscerated' }, 28 | [`weapon_switchblade`] = { ['name'] = 'weapon_switchblade', ['label'] = 'Switchblade', ['weapontype'] = 'Melee', 29 | ['ammotype'] = nil, ['damagereason'] = 'Knifed / Stabbed / Eviscerated' }, 30 | [`weapon_nightstick`] = { ['name'] = 'weapon_nightstick', ['label'] = 'Nightstick', ['weapontype'] = 'Melee', 31 | ['ammotype'] = nil, ['damagereason'] = 'Melee killed / Whacked / Executed / Beat down / Murdered / Battered' }, 32 | [`weapon_wrench`] = { ['name'] = 'weapon_wrench', ['label'] = 'Wrench', ['weapontype'] = 'Melee', 33 | ['ammotype'] = nil, ['damagereason'] = 'Melee killed / Whacked / Executed / Beat down / Murdered / Battered' }, 34 | [`weapon_battleaxe`] = { ['name'] = 'weapon_battleaxe', ['label'] = 'Battle Axe', ['weapontype'] = 'Melee', 35 | ['ammotype'] = nil, ['damagereason'] = 'Knifed / Stabbed / Eviscerated' }, 36 | [`weapon_poolcue`] = { ['name'] = 'weapon_poolcue', ['label'] = 'Poolcue', ['weapontype'] = 'Melee', 37 | ['ammotype'] = nil, ['damagereason'] = 'Melee killed / Whacked / Executed / Beat down / Murdered / Battered' }, 38 | [`weapon_briefcase`] = { ['name'] = 'weapon_briefcase', ['label'] = 'Briefcase', ['weapontype'] = 'Melee', 39 | ['ammotype'] = nil, ['damagereason'] = 'Melee killed / Whacked / Executed / Beat down / Murdered / Battered' }, 40 | [`weapon_briefcase_02`] = { ['name'] = 'weapon_briefcase_02', ['label'] = 'Briefcase', ['weapontype'] = 'Melee', 41 | ['ammotype'] = nil, ['damagereason'] = 'Melee killed / Whacked / Executed / Beat down / Murdered / Battered' }, 42 | [`weapon_garbagebag`] = { ['name'] = 'weapon_garbagebag', ['label'] = 'Garbage Bag', ['weapontype'] = 'Melee', 43 | ['ammotype'] = nil, ['damagereason'] = 'Melee killed / Whacked / Executed / Beat down / Murdered / Battered' }, 44 | [`weapon_handcuffs`] = { ['name'] = 'weapon_handcuffs', ['label'] = 'Handcuffs', ['weapontype'] = 'Melee', 45 | ['ammotype'] = nil, ['damagereason'] = 'Melee killed / Whacked / Executed / Beat down / Murdered / Battered' }, 46 | [`weapon_bread`] = { ['name'] = 'weapon_bread', ['label'] = 'Baquette', ['weapontype'] = 'Melee', 47 | ['ammotype'] = nil, ['damagereason'] = 'Melee killed / Whacked / Executed / Beat down / Murdered / Battered' }, 48 | [`weapon_stone_hatchet`] = { ['name'] = 'weapon_stone_hatchet', ['label'] = 'Stone Hatchet', ['weapontype'] = 'Melee', 49 | ['ammotype'] = nil, ['damagereason'] = 'Knifed / Stabbed / Eviscerated' }, 50 | 51 | -- Handguns 52 | [`weapon_pistol`] = { ['name'] = 'weapon_pistol', ['label'] = 'Pistol', ['weapontype'] = 'Pistol', 53 | ['ammotype'] = 'AMMO_PISTOL', ['damagereason'] = 'Pistoled / Blasted / Plugged / Bust a cap in' }, 54 | [`weapon_pistol_mk2`] = { ['name'] = 'weapon_pistol_mk2', ['label'] = 'Pistol Mk2', ['weapontype'] = 'Pistol', 55 | ['ammotype'] = 'AMMO_PISTOL', ['damagereason'] = 'Pistoled / Blasted / Plugged / Bust a cap in' }, 56 | [`weapon_combatpistol`] = { ['name'] = 'weapon_combatpistol', ['label'] = 'Combat Pistol', ['weapontype'] = 'Pistol', 57 | ['ammotype'] = 'AMMO_PISTOL', ['damagereason'] = 'Pistoled / Blasted / Plugged / Bust a cap in' }, 58 | [`weapon_appistol`] = { ['name'] = 'weapon_appistol', ['label'] = 'AP Pistol', ['weapontype'] = 'Pistol', 59 | ['ammotype'] = 'AMMO_PISTOL', ['damagereason'] = 'Pistoled / Blasted / Plugged / Bust a cap in' }, 60 | [`weapon_stungun`] = { ['name'] = 'weapon_stungun', ['label'] = 'Taser', ['weapontype'] = 'Pistol', 61 | ['ammotype'] = 'AMMO_STUNGUN', ['damagereason'] = 'Died' }, 62 | [`weapon_pistol50`] = { ['name'] = 'weapon_pistol50', ['label'] = 'Pistol .50 Cal', ['weapontype'] = 'Pistol', 63 | ['ammotype'] = 'AMMO_PISTOL', ['damagereason'] = 'Pistoled / Blasted / Plugged / Bust a cap in' }, 64 | [`weapon_snspistol`] = { ['name'] = 'weapon_snspistol', ['label'] = 'SNS Pistol', ['weapontype'] = 'Pistol', 65 | ['ammotype'] = 'AMMO_PISTOL', ['damagereason'] = 'Pistoled / Blasted / Plugged / Bust a cap in' }, 66 | [`weapon_snspistol_mk2`] = { ['name'] = 'weapon_snspistol_mk2', ['label'] = 'SNS Pistol MK2', ['weapontype'] = 'Pistol', 67 | ['ammotype'] = 'AMMO_PISTOL', ['damagereason'] = 'Pistoled / Blasted / Plugged / Bust a cap in' }, 68 | [`weapon_heavypistol`] = { ['name'] = 'weapon_heavypistol', ['label'] = 'Heavy Pistol', ['weapontype'] = 'Pistol', 69 | ['ammotype'] = 'AMMO_PISTOL', ['damagereason'] = 'Pistoled / Blasted / Plugged / Bust a cap in' }, 70 | [`weapon_vintagepistol`] = { ['name'] = 'weapon_vintagepistol', ['label'] = 'Vintage Pistol', ['weapontype'] = 'Pistol', 71 | ['ammotype'] = 'AMMO_PISTOL', ['damagereason'] = 'Pistoled / Blasted / Plugged / Bust a cap in' }, 72 | [`weapon_flaregun`] = { ['name'] = 'weapon_flaregun', ['label'] = 'Flare Gun', ['weapontype'] = 'Pistol', 73 | ['ammotype'] = 'AMMO_FLARE', ['damagereason'] = 'Died' }, 74 | [`weapon_marksmanpistol`] = { ['name'] = 'weapon_marksmanpistol', ['label'] = 'Marksman Pistol', 75 | ['weapontype'] = 'Pistol', ['ammotype'] = 'AMMO_PISTOL', ['damagereason'] = 'Pistoled / Blasted / Plugged / Bust a cap in' }, 76 | [`weapon_revolver`] = { ['name'] = 'weapon_revolver', ['label'] = 'Revolver', ['weapontype'] = 'Pistol', 77 | ['ammotype'] = 'AMMO_PISTOL', ['damagereason'] = 'Pistoled / Blasted / Plugged / Bust a cap in' }, 78 | [`weapon_revolver_mk2`] = { ['name'] = 'weapon_revolver_mk2', ['label'] = 'Revolver MK2', ['weapontype'] = 'Pistol', 79 | ['ammotype'] = 'AMMO_PISTOL', ['damagereason'] = 'Pistoled / Blasted / Plugged / Bust a cap in' }, 80 | [`weapon_doubleaction`] = { ['name'] = 'weapon_doubleaction', ['label'] = 'Double Action Revolver', 81 | ['weapontype'] = 'Pistol', ['ammotype'] = 'AMMO_PISTOL', ['damagereason'] = 'Pistoled / Blasted / Plugged / Bust a cap in' }, 82 | [`weapon_raypistol`] = { ['name'] = 'weapon_raypistol', ['label'] = 'Ray Pistol', ['weapontype'] = 'Pistol', 83 | ['ammotype'] = 'AMMO_PISTOL', ['damagereason'] = 'Pistoled / Blasted / Plugged / Bust a cap in' }, 84 | [`weapon_ceramicpistol`] = { ['name'] = 'weapon_ceramicpistol', ['label'] = 'Ceramic Pistol', ['weapontype'] = 'Pistol', 85 | ['ammotype'] = 'AMMO_PISTOL', ['damagereason'] = 'Pistoled / Blasted / Plugged / Bust a cap in' }, 86 | [`weapon_navyrevolver`] = { ['name'] = 'weapon_navyrevolver', ['label'] = 'Navy Revolver', ['weapontype'] = 'Pistol', 87 | ['ammotype'] = 'AMMO_PISTOL', ['damagereason'] = 'Pistoled / Blasted / Plugged / Bust a cap in' }, 88 | [`weapon_gadgetpistol`] = { ['name'] = 'weapon_gadgetpistol', ['label'] = 'Gadget Pistol', ['weapontype'] = 'Pistol', 89 | ['ammotype'] = 'AMMO_PISTOL', ['damagereason'] = 'Pistoled / Blasted / Plugged / Bust a cap in' }, 90 | [`weapon_stungun_mp`] = { ['name'] = 'weapon_stungun_mp', ['label'] = 'Taser', ['weapontype'] = 'Pistol', 91 | ['ammotype'] = 'AMMO_STUNGUN', ['damagereason'] = 'Died' }, 92 | 93 | -- Submachine Guns 94 | [`weapon_microsmg`] = { ['name'] = 'weapon_microsmg', ['label'] = 'Micro SMG', ['weapontype'] = 'Submachine Gun', 95 | ['ammotype'] = 'AMMO_SMG', ['damagereason'] = 'Riddled / Drilled / Finished / Submachine Gunned' }, 96 | [`weapon_smg`] = { ['name'] = 'weapon_smg', ['label'] = 'SMG', ['weapontype'] = 'Submachine Gun', 97 | ['ammotype'] = 'AMMO_SMG', ['damagereason'] = 'Riddled / Drilled / Finished / Submachine Gunned' }, 98 | [`weapon_smg_mk2`] = { ['name'] = 'weapon_smg_mk2', ['label'] = 'SMG MK2', ['weapontype'] = 'Submachine Gun', 99 | ['ammotype'] = 'AMMO_SMG', ['damagereason'] = 'Riddled / Drilled / Finished / Submachine Gunned' }, 100 | [`weapon_assaultsmg`] = { ['name'] = 'weapon_assaultsmg', ['label'] = 'Assault SMG', ['weapontype'] = 'Submachine Gun', 101 | ['ammotype'] = 'AMMO_SMG', ['damagereason'] = 'Riddled / Drilled / Finished / Submachine Gunned' }, 102 | [`weapon_combatpdw`] = { ['name'] = 'weapon_combatpdw', ['label'] = 'Combat PDW', ['weapontype'] = 'Submachine Gun', 103 | ['ammotype'] = 'AMMO_SMG', ['damagereason'] = 'Riddled / Drilled / Finished / Submachine Gunned' }, 104 | [`weapon_machinepistol`] = { ['name'] = 'weapon_machinepistol', ['label'] = 'Tec-9', ['weapontype'] = 'Submachine Gun', 105 | ['ammotype'] = 'AMMO_PISTOL', ['damagereason'] = 'Riddled / Drilled / Finished / Submachine Gunned' }, 106 | [`weapon_minismg`] = { ['name'] = 'weapon_minismg', ['label'] = 'Mini SMG', ['weapontype'] = 'Submachine Gun', 107 | ['ammotype'] = 'AMMO_SMG', ['damagereason'] = 'Riddled / Drilled / Finished / Submachine Gunned' }, 108 | [`weapon_raycarbine`] = { ['name'] = 'weapon_raycarbine', ['label'] = 'Raycarbine', ['weapontype'] = 'Submachine Gun', 109 | ['ammotype'] = 'AMMO_SMG', ['damagereason'] = 'Riddled / Drilled / Finished / Submachine Gunned' }, 110 | 111 | -- Shotguns 112 | [`weapon_pumpshotgun`] = { ['name'] = 'weapon_pumpshotgun', ['label'] = 'Pump Shotgun', ['weapontype'] = 'Shotgun', 113 | ['ammotype'] = 'AMMO_SHOTGUN', ['damagereason'] = 'Devastated / Pulverized / Shotgunned' }, 114 | [`weapon_pumpshotgun_mk2`] = { ['name'] = 'weapon_pumpshotgun_mk2', ['label'] = 'Pump Shotgun MK2', 115 | ['weapontype'] = 'Shotgun', ['ammotype'] = 'AMMO_SHOTGUN', ['damagereason'] = 'Devastated / Pulverized / Shotgunned' }, 116 | [`weapon_sawnoffshotgun`] = { ['name'] = 'weapon_sawnoffshotgun', ['label'] = 'Sawn-off Shotgun', 117 | ['weapontype'] = 'Shotgun', ['ammotype'] = 'AMMO_SHOTGUN', ['damagereason'] = 'Devastated / Pulverized / Shotgunned' }, 118 | [`weapon_assaultshotgun`] = { ['name'] = 'weapon_assaultshotgun', ['label'] = 'Assault Shotgun', 119 | ['weapontype'] = 'Shotgun', ['ammotype'] = 'AMMO_SHOTGUN', ['damagereason'] = 'Devastated / Pulverized / Shotgunned' }, 120 | [`weapon_bullpupshotgun`] = { ['name'] = 'weapon_bullpupshotgun', ['label'] = 'Bullpup Shotgun', 121 | ['weapontype'] = 'Shotgun', ['ammotype'] = 'AMMO_SHOTGUN', ['damagereason'] = 'Devastated / Pulverized / Shotgunned' }, 122 | [`weapon_musket`] = { ['name'] = 'weapon_musket', ['label'] = 'Musket', ['weapontype'] = 'Shotgun', 123 | ['ammotype'] = 'AMMO_SHOTGUN', ['damagereason'] = 'Devastated / Pulverized / Shotgunned' }, 124 | [`weapon_heavyshotgun`] = { ['name'] = 'weapon_heavyshotgun', ['label'] = 'Heavy Shotgun', ['weapontype'] = 'Shotgun', 125 | ['ammotype'] = 'AMMO_SHOTGUN', ['damagereason'] = 'Devastated / Pulverized / Shotgunned' }, 126 | [`weapon_dbshotgun`] = { ['name'] = 'weapon_dbshotgun', ['label'] = 'Double-barrel Shotgun', 127 | ['weapontype'] = 'Shotgun', ['ammotype'] = 'AMMO_SHOTGUN', ['damagereason'] = 'Devastated / Pulverized / Shotgunned' }, 128 | [`weapon_autoshotgun`] = { ['name'] = 'weapon_autoshotgun', ['label'] = 'Auto Shotgun', ['weapontype'] = 'Shotgun', 129 | ['ammotype'] = 'AMMO_SHOTGUN', ['damagereason'] = 'Devastated / Pulverized / Shotgunned' }, 130 | [`weapon_combatshotgun`] = { ['name'] = 'weapon_combatshotgun', ['label'] = 'Combat Shotgun', ['weapontype'] = 'Shotgun', 131 | ['ammotype'] = 'AMMO_SHOTGUN', ['damagereason'] = 'Devastated / Pulverized / Shotgunned' }, 132 | 133 | -- Assault Rifles 134 | [`weapon_assaultrifle`] = { ['name'] = 'weapon_assaultrifle', ['label'] = 'Assault Rifle', ['weapontype'] = 'Assault Rifle', 135 | ['ammotype'] = 'AMMO_RIFLE', ['damagereason'] = 'Ended / Rifled / Shot down / Floored' }, 136 | [`weapon_assaultrifle_mk2`] = { ['name'] = 'weapon_assaultrifle_mk2', ['label'] = 'Assault Rifle MK2', 137 | ['weapontype'] = 'Assault Rifle', ['ammotype'] = 'AMMO_RIFLE', ['damagereason'] = 'Ended / Rifled / Shot down / Floored' }, 138 | [`weapon_carbinerifle`] = { ['name'] = 'weapon_carbinerifle', ['label'] = 'Carbine Rifle', ['weapontype'] = 'Assault Rifle', 139 | ['ammotype'] = 'AMMO_RIFLE', ['damagereason'] = 'Ended / Rifled / Shot down / Floored' }, 140 | [`weapon_carbinerifle_mk2`] = { ['name'] = 'weapon_carbinerifle_mk2', ['label'] = 'Carbine Rifle MK2', 141 | ['weapontype'] = 'Assault Rifle', ['ammotype'] = 'AMMO_RIFLE', ['damagereason'] = 'Ended / Rifled / Shot down / Floored' }, 142 | [`weapon_advancedrifle`] = { ['name'] = 'weapon_advancedrifle', ['label'] = 'Advanced Rifle', ['weapontype'] = 'Assault Rifle', 143 | ['ammotype'] = 'AMMO_RIFLE', ['damagereason'] = 'Ended / Rifled / Shot down / Floored' }, 144 | [`weapon_specialcarbine`] = { ['name'] = 'weapon_specialcarbine', ['label'] = 'Special Carbine', 145 | ['weapontype'] = 'Assault Rifle', ['ammotype'] = 'AMMO_RIFLE', ['damagereason'] = 'Ended / Rifled / Shot down / Floored' }, 146 | [`weapon_specialcarbine_mk2`] = { ['name'] = 'weapon_specialcarbine_mk2', ['label'] = 'Specialcarbine MK2', 147 | ['weapontype'] = 'Assault Rifle', ['ammotype'] = 'AMMO_RIFLE', ['damagereason'] = 'Ended / Rifled / Shot down / Floored' }, 148 | [`weapon_bullpuprifle`] = { ['name'] = 'weapon_bullpuprifle', ['label'] = 'Bullpup Rifle', ['weapontype'] = 'Assault Rifle', 149 | ['ammotype'] = 'AMMO_RIFLE', ['damagereason'] = 'Ended / Rifled / Shot down / Floored' }, 150 | [`weapon_bullpuprifle_mk2`] = { ['name'] = 'weapon_bullpuprifle_mk2', ['label'] = 'Bull Puprifle MK2', 151 | ['weapontype'] = 'Assault Rifle', ['ammotype'] = 'AMMO_RIFLE', ['damagereason'] = 'Ended / Rifled / Shot down / Floored' }, 152 | [`weapon_compactrifle`] = { ['name'] = 'weapon_compactrifle', ['label'] = 'Compact Rifle', ['weapontype'] = 'Assault Rifle', 153 | ['ammotype'] = 'AMMO_RIFLE', ['damagereason'] = 'Ended / Rifled / Shot down / Floored' }, 154 | [`weapon_militaryrifle`] = { ['name'] = 'weapon_militaryrifle', ['label'] = 'Military Rifle', ['weapontype'] = 'Assault Rifle', 155 | ['ammotype'] = 'AMMO_RIFLE', ['damagereason'] = 'Ended / Rifled / Shot down / Floored' }, 156 | [`weapon_heavyrifle`] = { ['name'] = 'weapon_heavyrifle', ['label'] = 'Heavy Rifle', ['weapontype'] = 'Assault Rifle', 157 | ['ammotype'] = 'AMMO_RIFLE', ['damagereason'] = 'Ended / Rifled / Shot down / Floored' }, 158 | 159 | -- Light Machine Guns 160 | [`weapon_mg`] = { ['name'] = 'weapon_mg', ['label'] = 'Machinegun', ['weapontype'] = 'Light Machine Gun', 161 | ['ammotype'] = 'AMMO_MG', ['damagereason'] = 'Machine gunned / Sprayed / Ruined' }, 162 | [`weapon_combatmg`] = { ['name'] = 'weapon_combatmg', ['label'] = 'Combat MG', ['weapontype'] = 'Light Machine Gun', 163 | ['ammotype'] = 'AMMO_MG', ['damagereason'] = 'Machine gunned / Sprayed / Ruined' }, 164 | [`weapon_combatmg_mk2`] = { ['name'] = 'weapon_combatmg_mk2', ['label'] = 'Combat MG MK2', ['weapontype'] = 'Light Machine Gun', 165 | ['ammotype'] = 'AMMO_MG', ['damagereason'] = 'Machine gunned / Sprayed / Ruined' }, 166 | [`weapon_gusenberg`] = { ['name'] = 'weapon_gusenberg', ['label'] = 'Thompson SMG', ['weapontype'] = 'Light Machine Gun', 167 | ['ammotype'] = 'AMMO_MG', ['damagereason'] = 'Machine gunned / Sprayed / Ruined' }, 168 | 169 | -- Sniper Rifles 170 | [`weapon_sniperrifle`] = { ['name'] = 'weapon_sniperrifle', ['label'] = 'Sniper Rifle', ['weapontype'] = 'Sniper Rifle', 171 | ['ammotype'] = 'AMMO_SNIPER', ['damagereason'] = 'Sniped / Picked off / Scoped' }, 172 | [`weapon_heavysniper`] = { ['name'] = 'weapon_heavysniper', ['label'] = 'Heavy Sniper', ['weapontype'] = 'Sniper Rifle', 173 | ['ammotype'] = 'AMMO_SNIPER', ['damagereason'] = 'Sniped / Picked off / Scoped' }, 174 | [`weapon_heavysniper_mk2`] = { ['name'] = 'weapon_heavysniper_mk2', ['label'] = 'Heavysniper MK2', 175 | ['weapontype'] = 'Sniper Rifle', ['ammotype'] = 'AMMO_SNIPER', ['damagereason'] = 'Sniped / Picked off / Scoped' }, 176 | [`weapon_marksmanrifle`] = { ['name'] = 'weapon_marksmanrifle', ['label'] = 'Marksman Rifle', ['weapontype'] = 'Sniper Rifle', 177 | ['ammotype'] = 'AMMO_SNIPER', ['damagereason'] = 'Sniped / Picked off / Scoped' }, 178 | [`weapon_marksmanrifle_mk2`] = { ['name'] = 'weapon_marksmanrifle_mk2', ['label'] = 'Marksman Rifle MK2', 179 | ['weapontype'] = 'Sniper Rifle', ['ammotype'] = 'AMMO_SNIPER', ['damagereason'] = 'Sniped / Picked off / Scoped' }, 180 | [`weapon_remotesniper`] = { ['name'] = 'weapon_remotesniper', ['label'] = 'Remote Sniper', ['weapontype'] = 'Sniper Rifle', 181 | ['ammotype'] = 'AMMO_SNIPER_REMOTE', ['damagereason'] = 'Sniped / Picked off / Scoped' }, 182 | 183 | -- Heavy Weapons 184 | [`weapon_rpg`] = { ['name'] = 'weapon_rpg', ['label'] = 'RPG', ['weapontype'] = 'Heavy Weapons', 185 | ['ammotype'] = 'AMMO_RPG', ['damagereason'] = 'Killed / Exploded / Obliterated / Destroyed / Erased / Annihilated' }, 186 | [`weapon_grenadelauncher`] = { ['name'] = 'weapon_grenadelauncher', ['label'] = 'Grenade Launcher', 187 | ['weapontype'] = 'Heavy Weapons', ['ammotype'] = 'AMMO_GRENADELAUNCHER', ['damagereason'] = 'Killed / Exploded / Obliterated / Destroyed / Erased / Annihilated' }, 188 | [`weapon_grenadelauncher_smoke`] = { ['name'] = 'weapon_grenadelauncher_smoke', ['label'] = 'Smoke Grenade Launcher', 189 | ['weapontype'] = 'Heavy Weapons', ['ammotype'] = 'AMMO_GRENADELAUNCHER', ['damagereason'] = 'Killed / Exploded / Obliterated / Destroyed / Erased / Annihilated' }, 190 | [`weapon_minigun`] = { ['name'] = 'weapon_minigun', ['label'] = 'Minigun', ['weapontype'] = 'Heavy Weapons', 191 | ['ammotype'] = 'AMMO_MINIGUN', ['damagereason'] = 'Killed / Exploded / Obliterated / Destroyed / Erased / Annihilated' }, 192 | [`weapon_firework`] = { ['name'] = 'weapon_firework', ['label'] = 'Firework Launcher', ['weapontype'] = 'Heavy Weapons', 193 | ['ammotype'] = nil, ['damagereason'] = 'Killed / Exploded / Obliterated / Destroyed / Erased / Annihilated' }, 194 | [`weapon_railgun`] = { ['name'] = 'weapon_railgun', ['label'] = 'Railgun', ['weapontype'] = 'Heavy Weapons', 195 | ['ammotype'] = nil, ['damagereason'] = 'Killed / Exploded / Obliterated / Destroyed / Erased / Annihilated' }, 196 | [`weapon_hominglauncher`] = { ['name'] = 'weapon_hominglauncher', ['label'] = 'Homing Launcher', 197 | ['weapontype'] = 'Heavy Weapons', ['ammotype'] = 'AMMO_STINGER', ['damagereason'] = 'Killed / Exploded / Obliterated / Destroyed / Erased / Annihilated' }, 198 | [`weapon_compactlauncher`] = { ['name'] = 'weapon_compactlauncher', ['label'] = 'Compact Launcher', 199 | ['weapontype'] = 'Heavy Weapons', ['ammotype'] = nil, ['damagereason'] = 'Killed / Exploded / Obliterated / Destroyed / Erased / Annihilated' }, 200 | [`weapon_rayminigun`] = { ['name'] = 'weapon_rayminigun', ['label'] = 'Ray Minigun', ['weapontype'] = 'Heavy Weapons', 201 | ['ammotype'] = 'AMMO_MINIGUN', ['damagereason'] = 'Killed / Exploded / Obliterated / Destroyed / Erased / Annihilated' }, 202 | [`weapon_emplauncher`] = { ['name'] = 'weapon_emplauncher', ['label'] = 'EMP Launcher', ['weapontype'] = 'Heavy Weapons', 203 | ['ammotype'] = 'AMMO_EMPLAUNCHER', ['damagereason'] = 'Died' }, 204 | 205 | -- Throwables 206 | [`weapon_grenade`] = { ['name'] = 'weapon_grenade', ['label'] = 'Grenade', ['weapontype'] = 'Throwable', 207 | ['ammotype'] = nil, ['damagereason'] = 'Bombed / Exploded / Detonated / Blew up' }, 208 | [`weapon_bzgas`] = { ['name'] = 'weapon_bzgas', ['label'] = 'BZ Gas', ['weapontype'] = 'Throwable', 209 | ['ammotype'] = nil, ['damagereason'] = 'Died' }, 210 | [`weapon_molotov`] = { ['name'] = 'weapon_molotov', ['label'] = 'Molotov', ['weapontype'] = 'Throwable', 211 | ['ammotype'] = nil, ['damagereason'] = 'Torched / Flambeed / Barbecued' }, 212 | [`weapon_stickybomb`] = { ['name'] = 'weapon_stickybomb', ['label'] = 'C4', ['weapontype'] = 'Throwable', 213 | ['ammotype'] = nil, ['damagereason'] = 'Bombed / Exploded / Detonated / Blew up' }, 214 | [`weapon_proxmine`] = { ['name'] = 'weapon_proxmine', ['label'] = 'Proxmine Grenade', ['weapontype'] = 'Throwable', 215 | ['ammotype'] = nil, ['damagereason'] = 'Bombed / Exploded / Detonated / Blew up' }, 216 | [`weapon_snowball`] = { ['name'] = 'weapon_snowball', ['label'] = 'Snowball', ['weapontype'] = 'Throwable', 217 | ['ammotype'] = nil, ['damagereason'] = 'Died' }, 218 | [`weapon_pipebomb`] = { ['name'] = 'weapon_pipebomb', ['label'] = 'Pipe Bomb', ['weapontype'] = 'Throwable', 219 | ['ammotype'] = nil, ['damagereason'] = 'Bombed / Exploded / Detonated / Blew up' }, 220 | [`weapon_ball`] = { ['name'] = 'weapon_ball', ['label'] = 'Ball', ['weapontype'] = 'Throwable', 221 | ['ammotype'] = 'AMMO_BALL', ['damagereason'] = 'Died' }, 222 | [`weapon_smokegrenade`] = { ['name'] = 'weapon_smokegrenade', ['label'] = 'Smoke Grenade', ['weapontype'] = 'Throwable', 223 | ['ammotype'] = nil, ['damagereason'] = 'Died' }, 224 | [`weapon_flare`] = { ['name'] = 'weapon_flare', ['label'] = 'Flare pistol', ['weapontype'] = 'Throwable', 225 | ['ammotype'] = 'AMMO_FLARE', ['damagereason'] = 'Died' }, 226 | 227 | -- Miscellaneous 228 | [`weapon_petrolcan`] = { ['name'] = 'weapon_petrolcan', ['label'] = 'Petrol Can', ['weapontype'] = 'Miscellaneous', 229 | ['ammotype'] = 'AMMO_PETROLCAN', ['damagereason'] = 'Died' }, 230 | [`gadget_parachute`] = { ['name'] = 'gadget_parachute', ['label'] = 'Parachute', ['weapontype'] = 'Miscellaneous', 231 | ['ammotype'] = nil, ['damagereason'] = 'Died' }, 232 | [`weapon_fireextinguisher`] = { ['name'] = 'weapon_fireextinguisher', ['label'] = 'Fire Extinguisher', 233 | ['weapontype'] = 'Miscellaneous', ['ammotype'] = nil, ['damagereason'] = 'Died' }, 234 | [`weapon_hazardcan`] = { ['name'] = 'weapon_hazardcan', ['label'] = 'Hazardcan', ['weapontype'] = 'Miscellaneous', 235 | ['ammotype'] = 'AMMO_PETROLCAN', ['damagereason'] = 'Died' }, 236 | [`weapon_fertilizercan`] = { ['name'] = 'weapon_fertilizercan', ['label'] = 'Fertilizer Can', ['weapontype'] = 'Miscellaneous', 237 | ['ammotype'] = 'AMMO_FERTILIZERCAN', ['damagereason'] = 'Died' }, 238 | [`weapon_barbed_wire`] = { ['name'] = 'weapon_barbed_wire', ['label'] = 'Barbed Wire', ['weapontype'] = 'Miscellaneous', 239 | ['ammotype'] = nil, ['damagereason'] = 'Prodded' }, 240 | [`weapon_drowning`] = { ['name'] = 'weapon_drowning', ['label'] = 'Drowning', ['weapontype'] = 'Miscellaneous', 241 | ['ammotype'] = nil, ['damagereason'] = 'Died' }, 242 | [`weapon_drowning_in_vehicle`] = { ['name'] = 'weapon_drowning_in_vehicle', ['label'] = 'Drowning in a Vehicle', 243 | ['weapontype'] = 'Miscellaneous', ['ammotype'] = nil, ['damagereason'] = 'Died' }, 244 | [`weapon_bleeding`] = { ['name'] = 'weapon_bleeding', ['label'] = 'Bleeding', ['weapontype'] = 'Miscellaneous', 245 | ['ammotype'] = nil, ['damagereason'] = 'Bled out' }, 246 | [`weapon_electric_fence`] = { ['name'] = 'weapon_electric_fence', ['label'] = 'Electric Fence', ['weapontype'] = 'Miscellaneous', 247 | ['ammotype'] = nil, ['damagereason'] = 'Fried' }, 248 | [`weapon_explosion`] = { ['name'] = 'weapon_explosion', ['label'] = 'Explosion', ['weapontype'] = 'Miscellaneous', 249 | ['ammotype'] = nil, ['damagereason'] = 'Killed / Exploded / Obliterated / Destroyed / Erased / Annihilated' }, 250 | [`weapon_fall`] = { ['name'] = 'weapon_fall', ['label'] = 'Fall', ['weapontype'] = 'Miscellaneous', 251 | ['ammotype'] = nil, ['damagereason'] = 'Committed suicide' }, 252 | [`weapon_exhaustion`] = { ['name'] = 'weapon_exhaustion', ['label'] = 'Exhaustion', ['weapontype'] = 'Miscellaneous', 253 | ['ammotype'] = nil, ['damagereason'] = 'Died' }, 254 | [`weapon_hit_by_water_cannon`] = { ['name'] = 'weapon_hit_by_water_cannon', ['label'] = 'Water Cannon', 255 | ['weapontype'] = 'Miscellaneous', ['ammotype'] = nil, ['damagereason'] = 'Died' }, 256 | [`weapon_rammed_by_car`] = { ['name'] = 'weapon_rammed_by_car', ['label'] = 'Rammed - Vehicle', 257 | ['weapontype'] = 'Miscellaneous', ['ammotype'] = nil, ['damagereason'] = 'Flattened / Ran over / Ran down' }, 258 | [`weapon_run_over_by_car`] = { ['name'] = 'weapon_run_over_by_car', ['label'] = 'Run Over - Vehicle', 259 | ['weapontype'] = 'Miscellaneous', ['ammotype'] = nil, ['damagereason'] = 'Flattened / Ran over / Ran down' }, 260 | [`weapon_heli_crash`] = { ['name'] = 'weapon_heli_crash', ['label'] = 'Heli Crash', ['weapontype'] = 'Miscellaneous', 261 | ['ammotype'] = nil, ['damagereason'] = 'Helicopter Crash' }, 262 | [`weapon_fire`] = { ['name'] = 'weapon_fire', ['label'] = 'Fire', ['weapontype'] = 'Miscellaneous', 263 | ['ammotype'] = nil, ['damagereason'] = 'Torched / Flambeed / Barbecued' }, 264 | 265 | -- Animals 266 | [`weapon_animal`] = { ['name'] = 'weapon_animal', ['label'] = 'Animal', ['weapontype'] = 'Animals', 267 | ['ammotype'] = nil, ['damagereason'] = 'Mauled' }, 268 | [`weapon_cougar`] = { ['name'] = 'weapon_cougar', ['label'] = 'Cougar', ['weapontype'] = 'Animals', 269 | ['ammotype'] = nil, ['damagereason'] = 'Mauled' }, 270 | } 271 | -------------------------------------------------------------------------------- /config.lua: -------------------------------------------------------------------------------- 1 | Config = { 2 | Framework = "qb", -- qb / esx 3 | GPSItem = "gps", 4 | SetWaypoingKey = "G", 5 | 6 | WaitTimes = { -- Cooldown after a dispatch to send another one. 7 | Shooting = 45, -- Seconds 8 | Speeding = 60, -- Seconds 9 | }, 10 | 11 | Enable = { -- Enable or disable built-in dispatches 12 | Speeding = true, 13 | Shooting = true, 14 | PlayerDeath = true, 15 | UseSuppressorControl = true, 16 | UseGPS = true, -- Players will receive an alert if only they have a gps 17 | }, 18 | 19 | WhitelistedJobs = { -- Jobs that won't going to give an alert. 20 | "police", 21 | "sheriff", 22 | "ambulance" 23 | }, 24 | 25 | BlipRemoveTime = 30, -- Seconds 26 | 27 | Notification = function(title, message, type, length) 28 | -- Your notification here 29 | end, 30 | 31 | BlackListedWeapons = { -- Weapons that wont give an alert 32 | 'WEAPON_STUNGUN', 33 | 'WEAPON_BZGAS', 34 | 'WEAPON_SNOWBALL', 35 | 'WEAPON_MOLOTOV', 36 | 'WEAPON_FLARE', 37 | 'WEAPON_BALL', 38 | 'WEAPON_PETROLCAN', 39 | 'WEAPON_HAZARDCAN', 40 | 'WEAPON_FIREEXTINGUISHER', 41 | }, 42 | 43 | Suppressors = { -- Suppressor hash codes 44 | 0x65EA7EBB, 45 | 0xC304849A, 46 | 0xA73D4664, 47 | 0x9307D6FA, 48 | 0xE608B35E, 49 | 0x837445AA, 50 | 0xAC42DF71, 51 | 0x9BC64089, 52 | } 53 | } -------------------------------------------------------------------------------- /fxmanifest.lua: -------------------------------------------------------------------------------- 1 | fx_version 'cerulean' 2 | game 'gta5' 3 | author 'atiysu' 4 | lua54 'yes' 5 | 6 | shared_scripts{ 7 | 'config.lua' 8 | } 9 | 10 | client_scripts { 11 | 'client/utils.lua', 12 | 'client/weapons.lua', 13 | 'client/colors.lua', 14 | 'client/client.lua', 15 | 'client/commands.lua', 16 | } 17 | 18 | server_scripts { 19 | 'server/server.lua', 20 | } 21 | 22 | ui_page 'ui/index.html' 23 | 24 | files { 25 | 'ui/**/*.*', 26 | 'ui/*.*', 27 | } 28 | 29 | export 'SendDispatch' -------------------------------------------------------------------------------- /server/server.lua: -------------------------------------------------------------------------------- 1 | Framework = Config.Framework == "esx" and exports['es_extended']:getSharedObject() or exports['qb-core']:GetCoreObject() 2 | 3 | RegisterNetEvent("aty_dispatch:server:shootingDispatch", function(title, code, location, coords, gender, weapon, vehicleName, vehicle, jobs) 4 | local players = GetPlayers() 5 | 6 | for i, player in ipairs(players) do 7 | local player = tonumber(player) 8 | if Config.Framework == "qb" then 9 | local xPlayer = Framework.Functions.GetPlayer(player) 10 | 11 | if Config.Enable.UseGPS then 12 | for _, job in pairs(jobs) do 13 | local item = xPlayer.Functions.GetItemByName(Config.GPSItem) and xPlayer.Functions.GetItemByName(Config.GPSItem).amount or 0 14 | if xPlayer.PlayerData.job.name == job and item > 0 then 15 | TriggerClientEvent("aty_dispatch:client:shootingDispatch", player, title, code, location, coords, gender, weapon, vehicleName, vehicle) 16 | end 17 | end 18 | else 19 | for _, job in pairs(jobs) do 20 | if xPlayer.PlayerData.job.name == job then 21 | TriggerClientEvent("aty_dispatch:client:shootingDispatch", player, title, code, location, coords, gender, weapon, vehicleName, vehicle) 22 | end 23 | end 24 | end 25 | else 26 | local xPlayer = Framework.GetPlayerFromId(player) 27 | 28 | if Config.Enable.UseGPS then 29 | for _, job in pairs(jobs) do 30 | local item = xPlayer.getInventoryItem(Config.GPSItem) and xPlayer.getInventoryItem(Config.GPSItem).count or 0 31 | if xPlayer.job.name == job and item > 0 then 32 | TriggerClientEvent("aty_dispatch:client:shootingDispatch", player, title, code, location, coords, gender, weapon, vehicleName, vehicle) 33 | end 34 | end 35 | else 36 | for _, job in pairs(jobs) do 37 | if xPlayer.job.name == job then 38 | TriggerClientEvent("aty_dispatch:client:shootingDispatch", player, title, code, location, coords, gender, weapon, vehicleName, vehicle) 39 | end 40 | end 41 | end 42 | end 43 | end 44 | end) 45 | 46 | RegisterNetEvent("aty_dispatch:server:customDispatch", function(title, code, location, coords, gender, vehicleName, vehicle, weapon, blipSprite, jobs) 47 | local players = GetPlayers() 48 | 49 | for i, player in ipairs(players) do 50 | local player = tonumber(player) 51 | if Config.Framework == "qb" then 52 | local xPlayer = Framework.Functions.GetPlayer(player) 53 | 54 | if Config.Enable.UseGPS then 55 | for _, job in pairs(jobs) do 56 | local item = xPlayer.Functions.GetItemByName(Config.GPSItem) and xPlayer.Functions.GetItemByName(Config.GPSItem).amount or 0 57 | if xPlayer.PlayerData.job.name == job and item > 0 then 58 | TriggerClientEvent("aty_dispatch:client:customDispatch", player, title, code, location, coords, gender, vehicleName, vehicle, weapon, blipSprite) 59 | end 60 | end 61 | else 62 | for _, job in pairs(jobs) do 63 | if xPlayer.PlayerData.job.name == job then 64 | TriggerClientEvent("aty_dispatch:client:customDispatch", player, title, code, location, coords, gender, vehicleName, vehicle, weapon, blipSprite) 65 | end 66 | end 67 | end 68 | else 69 | local xPlayer = Framework.GetPlayerFromId(player) 70 | 71 | if Config.Enable.UseGPS then 72 | for _, job in pairs(jobs) do 73 | local item = xPlayer.getInventoryItem(Config.GPSItem) and xPlayer.getInventoryItem(Config.GPSItem).count or 0 74 | if xPlayer.job.name == job and item > 0 then 75 | TriggerClientEvent("aty_dispatch:client:customDispatch", player, title, code, location, coords, gender, vehicleName, vehicle, weapon, blipSprite) 76 | end 77 | end 78 | else 79 | for _, job in pairs(jobs) do 80 | if xPlayer.job.name == job then 81 | TriggerClientEvent("aty_dispatch:client:customDispatch", player, title, code, location, coords, gender, vehicleName, vehicle, weapon, blipSprite) 82 | end 83 | end 84 | end 85 | end 86 | end 87 | end) -------------------------------------------------------------------------------- /ui/assets/icons/clock.svg: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /ui/assets/icons/distance.svg: -------------------------------------------------------------------------------- 1 | 8 | -------------------------------------------------------------------------------- /ui/assets/icons/gender.svg: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /ui/assets/icons/location.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui/assets/icons/paint.svg: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /ui/assets/icons/patch.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ui/assets/icons/plate.svg: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /ui/assets/icons/vehicle.svg: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /ui/assets/icons/weapon.svg: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /ui/css/style.css: -------------------------------------------------------------------------------- 1 | @import url("https://fonts.googleapis.com/css2?family=Istok+Web:wght@400;700&display=swap"); 2 | * { 3 | margin: 0; 4 | padding: 0; 5 | box-sizing: border-box; 6 | font-family: "Istok Web", sans-serif; 7 | user-select: none; 8 | line-height: 100%; 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | text-rendering: optimizeLegibility; 12 | } 13 | 14 | body { 15 | width: 100vw; 16 | height: 100vh; 17 | overflow: hidden; 18 | color: #FFF; 19 | } 20 | 21 | .container, .showDispatch { 22 | width: 430px; 23 | height: fit-content; 24 | max-height: 100%; 25 | overflow-y: scroll; 26 | position: absolute; 27 | right: 60px; 28 | top: 60px; 29 | display: flex; 30 | flex-direction: column; 31 | gap: 10px; 32 | } 33 | .container.container .dispatch, .showDispatch.container .dispatch { 34 | transform: translateX(500px); 35 | } 36 | .container.showDispatch, .showDispatch.showDispatch { 37 | left: 60px !important; 38 | padding-bottom: 120px; 39 | } 40 | .container::-webkit-scrollbar, .showDispatch::-webkit-scrollbar { 41 | width: 0px; 42 | } 43 | .container .dispatch, .showDispatch .dispatch { 44 | padding: 14px; 45 | border-radius: 5px; 46 | border: 1px solid #2E2E2E; 47 | background: rgba(21, 21, 24, 0.9); 48 | position: relative; 49 | transition: transform 0.6s cubic-bezier(0, 0.99, 0.45, 0.94); 50 | box-shadow: 0 0 1px 0 #2E2E2E; 51 | } 52 | .container .dispatch .header, .showDispatch .dispatch .header { 53 | width: 100%; 54 | height: 26px; 55 | display: flex; 56 | align-items: center; 57 | position: relative; 58 | } 59 | .container .dispatch .header .icon, .showDispatch .dispatch .header .icon { 60 | position: absolute; 61 | right: 0; 62 | } 63 | .container .dispatch .header .title, .showDispatch .dispatch .header .title { 64 | color: #CFCFCF; 65 | font-size: 15px; 66 | font-weight: 700; 67 | } 68 | .container .dispatch .header .count, .container .dispatch .header .code, .showDispatch .dispatch .header .count, .showDispatch .dispatch .header .code { 69 | height: 24px; 70 | border-radius: 5px; 71 | border: 1px solid #2E2E2E; 72 | background: rgba(84, 84, 84, 0.1); 73 | box-shadow: 0 0 1px 0 #2E2E2E; 74 | margin-right: 5px; 75 | color: #CFCFCF; 76 | font-size: 13px; 77 | font-weight: 700; 78 | display: flex; 79 | justify-content: center; 80 | padding: 0 14px; 81 | align-items: center; 82 | } 83 | .container .dispatch .header .count.code, .container .dispatch .header .code.code, .showDispatch .dispatch .header .count.code, .showDispatch .dispatch .header .code.code { 84 | margin-right: 8px; 85 | } 86 | .container .dispatch .info-wrapper, .showDispatch .dispatch .info-wrapper { 87 | display: flex; 88 | flex-direction: column; 89 | width: 100%; 90 | height: fit-content; 91 | gap: 8px; 92 | margin-top: 10px; 93 | } 94 | .container .dispatch .info-wrapper .info, .showDispatch .dispatch .info-wrapper .info { 95 | display: flex; 96 | gap: 5px; 97 | font-size: 12px; 98 | } 99 | .container .dispatch .info-wrapper .info .icon, .showDispatch .dispatch .info-wrapper .info .icon { 100 | width: 10px; 101 | } 102 | .container .dispatch .time-sent, .showDispatch .dispatch .time-sent { 103 | position: absolute; 104 | right: 14px; 105 | bottom: 14px; 106 | display: flex; 107 | gap: 5px; 108 | color: rgba(207, 207, 207, 0.5); 109 | font-size: 12px; 110 | align-items: center; 111 | } 112 | 113 | /*# sourceMappingURL=style.css.map */ 114 | -------------------------------------------------------------------------------- /ui/css/style.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["style.scss"],"names":[],"mappings":"AAAQ;AAER;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAKZ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAEA;EACI;;AAKZ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA","file":"style.css"} -------------------------------------------------------------------------------- /ui/css/style.scss: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Istok+Web:wght@400;700&display=swap'); 2 | 3 | *{ 4 | margin: 0; 5 | padding: 0; 6 | box-sizing: border-box; 7 | font-family: 'Istok Web', sans-serif; 8 | user-select: none; 9 | line-height: 100%; 10 | -webkit-font-smoothing: antialiased; 11 | -moz-osx-font-smoothing: grayscale; 12 | text-rendering: optimizeLegibility; 13 | } 14 | 15 | body{ 16 | width: 100vw; 17 | height: 100vh; 18 | overflow: hidden; 19 | color: #FFF; 20 | } 21 | 22 | .container, .showDispatch{ 23 | width: 430px; 24 | height: fit-content; 25 | max-height: 100%; 26 | overflow-y: scroll; 27 | position: absolute; 28 | right: 60px; 29 | top: 60px; 30 | display: flex; 31 | flex-direction: column; 32 | gap: 10px; 33 | 34 | &.container .dispatch{ 35 | transform: translateX(500px); 36 | } 37 | 38 | &.showDispatch{ 39 | left: 60px !important; 40 | padding-bottom: 120px; 41 | } 42 | 43 | &::-webkit-scrollbar { 44 | width: 0px; 45 | } 46 | 47 | .dispatch{ 48 | padding: 14px; 49 | border-radius: 5px; 50 | border: 1px solid #2E2E2E; 51 | background: rgba(21, 21, 24, 0.9); 52 | position: relative; 53 | transition: transform 0.6s cubic-bezier(0,.99,.45,.94); 54 | box-shadow: 0 0 1px 0 #2E2E2E; 55 | 56 | .header{ 57 | width: 100%; 58 | height: 26px; 59 | display: flex; 60 | align-items: center; 61 | position: relative; 62 | 63 | .icon{ 64 | position: absolute; 65 | right: 0; 66 | } 67 | 68 | .title{ 69 | color: #CFCFCF; 70 | font-size: 15px; 71 | font-weight: 700; 72 | } 73 | 74 | .count, .code{ 75 | height: 24px; 76 | border-radius: 5px; 77 | border: 1px solid #2E2E2E; 78 | background: rgba(84, 84, 84, 0.10); 79 | box-shadow: 0 0 1px 0 #2E2E2E; 80 | margin-right: 5px; 81 | color: #CFCFCF; 82 | font-size: 13px; 83 | font-weight: 700; 84 | display: flex; 85 | justify-content: center; 86 | padding: 0 14px; 87 | align-items: center; 88 | 89 | &.code{ 90 | margin-right: 8px; 91 | } 92 | } 93 | } 94 | 95 | .info-wrapper{ 96 | display: flex; 97 | flex-direction: column; 98 | width: 100%; 99 | height: fit-content; 100 | gap: 8px; 101 | margin-top: 10px; 102 | 103 | .info{ 104 | display: flex; 105 | gap: 5px; 106 | font-size: 12px; 107 | 108 | .icon{ 109 | width: 10px; 110 | } 111 | } 112 | } 113 | 114 | .time-sent{ 115 | position: absolute; 116 | right: 14px; 117 | bottom: 14px; 118 | display: flex; 119 | gap: 5px; 120 | color: rgba(207, 207, 207, 0.5); 121 | font-size: 12px; 122 | align-items: center; 123 | } 124 | } 125 | } -------------------------------------------------------------------------------- /ui/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 |