├── LICENSE ├── Main.lua ├── README.md ├── changelog.txt ├── guis └── textures │ └── VoidUI │ ├── hud_badges.texture │ ├── hud_extras.texture │ ├── hud_health.texture │ ├── hud_highlights.texture │ └── hud_weapons.texture ├── loc ├── english.json ├── french.json ├── italian.json ├── korean.json ├── portuguese.json ├── russian.json └── schinese.json ├── lua ├── hud │ ├── HudAssaultCorner.lua │ ├── HudBlackscreen.lua │ ├── HudChat.lua │ ├── HudDowns.lua │ ├── HudHeistTimer.lua │ ├── HudHint.lua │ ├── HudInteraction.lua │ ├── HudObjectives.lua │ ├── HudPlayerDowned.lua │ ├── HudPresenter.lua │ ├── HudScoreboard.lua │ ├── HudSuspicion.lua │ ├── HudTeammate.lua │ ├── HudTemp.lua │ └── HudVoice.lua ├── managers │ ├── HudManager.lua │ └── Jokers.lua └── menu │ ├── CustomMenu.lua │ └── LevelLoadingScreen.lua ├── menu ├── assault.json ├── chat.json ├── hudteammate.json ├── interact.json ├── joining.json ├── label.json ├── loadingscreen.json ├── objectives.json ├── options.json ├── presenter.json ├── scoreboard.json └── subtitles.json ├── mod.txt ├── mod_icon.png └── updates ├── meta_voidui.json └── voidui.zip /Main.lua: -------------------------------------------------------------------------------- 1 | _G.VoidUI = _G.VoidUI or {} 2 | VoidUI.Warning = 0 3 | VoidUI.loaded = false 4 | VoidUI.mod_path = ModPath 5 | VoidUI.options_path = SavePath .. "VoidUI.txt" 6 | VoidUI.options = {} 7 | VoidUI.menus = {} 8 | VoidUI.hook_files = { 9 | ["lib/managers/hudmanager"] = {"managers/HudManager.lua"}, 10 | ["lib/units/enemies/cop/copdamage"] = {"managers/Jokers.lua", "hud/HudScoreboard.lua"}, 11 | ["lib/units/player_team/teamaidamage"] = {"managers/HudManager.lua"}, 12 | ["lib/units/player_team/huskteamaidamage"] = {"managers/HudManager.lua"}, 13 | ["core/lib/managers/subtitle/coresubtitlepresenter"] = {"managers/HudManager.lua"}, 14 | ["lib/managers/hud/hudwaitinglegend"] = {"managers/HudManager.lua"}, 15 | ["lib/units/player_team/teamaiinventory"] = {"managers/HudManager.lua"}, 16 | ["lib/managers/achievmentmanager"] = {"managers/HudManager.lua"}, 17 | ["lib/managers/playermanager"] = {"managers/HudManager.lua"}, 18 | ["lib/managers/menumanagerdialogs"] = {"managers/HudManager.lua"}, 19 | ["lib/network/base/basenetworksession"] = {"managers/HudManager.lua"}, 20 | ["lib/states/ingamemaskoff"] = {"managers/HudManager.lua"}, 21 | ["lib/units/contourext"] = {"managers/Jokers.lua"}, 22 | ["lib/managers/hud/hudteammate"] = {"hud/HudTeammate.lua"}, 23 | ["lib/managers/hud/hudtemp"] = {"hud/HudTemp.lua"}, 24 | ["lib/managers/hud/hudblackscreen"] = {"hud/HudBlackscreen.lua"}, 25 | ["lib/managers/hud/hudsuspicion"] = {"hud/HudSuspicion.lua"}, 26 | ["lib/states/ingamewaitingforplayers"] = {"hud/HudBlackscreen.lua"}, 27 | ["lib/managers/menu/fadeoutguiobject"] = {"hud/HudBlackscreen.lua"}, 28 | ["lib/managers/hudmanagerpd2"] = {"managers/HudManager.lua", "hud/HudScoreboard.lua", "hud/HudVoice.lua"}, 29 | ["lib/units/beings/player/huskplayermovement"] = {"hud/HudPlayerDowned.lua"}, 30 | ["lib/units/beings/player/states/playerbleedout"] = {"hud/HudPlayerDowned.lua"}, 31 | ["lib/network/handlers/unitnetworkhandler"] = {"hud/HudPlayerDowned.lua", "managers/Jokers.lua"}, 32 | ["lib/units/equipment/doctor_bag/doctorbagbase"] = {"hud/HudPlayerDowned.lua"}, 33 | ["lib/managers/hud/hudplayerdowned"] = {"hud/HudPlayerDowned.lua"}, 34 | ["lib/managers/hud/hudobjectives"] = {"hud/HudObjectives.lua"}, 35 | ["lib/managers/hud/hudheisttimer"] = {"hud/HudHeistTimer.lua"}, 36 | ["lib/managers/hud/hudchallengenotification"] = {"hud/HudPresenter.lua"}, 37 | ["lib/managers/hud/hudpresenter"] = {"hud/HudPresenter.lua"}, 38 | ["lib/managers/hud/hudhint"] = {"hud/HudHint.lua"}, 39 | ["lib/managers/hintmanager"] = {"hud/HudHint.lua"}, 40 | ["lib/managers/hud/hudinteraction"] = {"hud/HudInteraction.lua"}, 41 | ["lib/managers/hud/hudchat"] = {"hud/HudChat.lua"}, 42 | ["lib/managers/hud/hudassaultcorner"] = {"hud/HudAssaultCorner.lua"}, 43 | ["lib/managers/group_ai_states/groupaistatebase"] = {"hud/HudAssaultCorner.lua", "managers/Jokers.lua"}, 44 | ["lib/managers/objectinteractionmanager"] = {"hud/HudAssaultCorner.lua"}, 45 | ["lib/units/equipment/ecm_jammer/ecmjammerbase"] = {"hud/HudAssaultCorner.lua"}, 46 | ["lib/units/enemies/cop/huskcopbrain"] = {"managers/Jokers.lua"}, 47 | ["lib/units/civilians/civiliandamage"] = {"hud/HudScoreboard.lua"}, 48 | ["lib/managers/hud/newhudstatsscreen"] = {"hud/HudScoreboard.lua"}, 49 | ["lib/managers/hud/hudstatsscreenskirmish"] = {"hud/HudScoreboard.lua"}, 50 | ["lib/network/base/clientnetworksession"] = {"menu/LevelLoadingScreen.lua"}, 51 | ["lib/network/base/hostnetworksession"] = {"menu/LevelLoadingScreen.lua"}, 52 | ["lib/setups/setup"] = {"menu/LevelLoadingScreen.lua"}, 53 | ["lib/managers/menumanager"] = {"menu/CustomMenu.lua"}, 54 | ["lib/network/matchmaking/networkvoicechatsteam"] = {"hud/HudVoice.lua"} 55 | } 56 | 57 | function VoidUI:Save() 58 | local file = io.open( self.options_path, "w+" ) 59 | if file then 60 | file:write( json.encode( self.options ) ) 61 | file:close() 62 | end 63 | end 64 | function VoidUI:Load() 65 | local file = io.open( self.options_path, "r" ) 66 | if file then 67 | self.options_temp = json.decode( file:read("*all") ) 68 | file:close() 69 | for k,v in pairs(self.options_temp) do 70 | self.options[k] = v 71 | end 72 | self.options_temp = nil 73 | else 74 | VoidUI:DefaultConfig() 75 | VoidUI:Save() 76 | end 77 | end 78 | function VoidUI:LoadTextures() 79 | for _, file in pairs(file.GetFiles(VoidUI.mod_path.. "guis/textures/VoidUI")) do 80 | DB:create_entry(Idstring("texture"), Idstring("guis/textures/VoidUI/".. file:gsub(".texture", "")), VoidUI.mod_path.. "guis/textures/VoidUI/".. file) 81 | end 82 | end 83 | Hooks:Add("LocalizationManagerPostInit", "VoidUI_Localization", function(loc) 84 | local loc_path = VoidUI.mod_path .. "loc/" 85 | 86 | if file.DirectoryExists(loc_path) then 87 | if BLT.Localization._current == 'pt-br' then 88 | loc:load_localization_file(loc_path .. "portuguese.json") 89 | else 90 | for _, filename in pairs(file.GetFiles(loc_path)) do 91 | local str = filename:match('^(.*).json$') 92 | if str and Idstring(str) and Idstring(str):key() == SystemInfo:language():key() then 93 | loc:load_localization_file(loc_path .. filename) 94 | break 95 | end 96 | end 97 | end 98 | loc:load_localization_file(loc_path .. "english.json", false) 99 | else 100 | log("Localization folder seems to be missing!") 101 | end 102 | end) 103 | 104 | function VoidUI:DefaultConfig() 105 | VoidUI.options = { 106 | hud_scale = 1, 107 | hud_main_scale = 1, 108 | hud_mate_scale = 1, 109 | hud_chat_scale = 1, 110 | scoreboard_scale = 1, 111 | hud_assault_scale = 1, 112 | hud_objectives_scale = 1, 113 | presenter_scale = 1, 114 | suspicion_scale = 1, 115 | interact_scale = 1, 116 | challanges_scale = 1, 117 | hint_scale = 1, 118 | label_scale = 1, 119 | waypoint_scale = 0.8, 120 | subtitle_scale = 0.9, 121 | joining_mods_scale = 1, 122 | voice_scale = 1, 123 | teammate_panels = true, 124 | enable_interact = true, 125 | enable_suspicion = true, 126 | enable_assault = true, 127 | enable_chat = true, 128 | enable_labels = true, 129 | enable_timer = true, 130 | enable_objectives = true, 131 | enable_presenter = true, 132 | enable_hint = true, 133 | enable_blackscreen = true, 134 | enable_stats = true, 135 | enable_subtitles = true, 136 | enable_challanges = true, 137 | enable_loadingscreen = true, 138 | enable_joining = true, 139 | enable_waypoints = true, 140 | enable_voice = true, 141 | loading_heistinfo = true, 142 | loading_players = true, 143 | loading_briefing = false, 144 | totalammo = true, 145 | main_loud = true, 146 | main_stealth = true, 147 | mate_loud = true, 148 | mate_stealth = true, 149 | mate_name = true, 150 | show_levelname = true, 151 | show_ghost_icon = true, 152 | show_badge = true, 153 | anim_badge = true, 154 | show_charactername = true, 155 | label_jokers = true, 156 | label_minmode = true, 157 | label_minrank = true, 158 | label_upper = false, 159 | mate_upper = false, 160 | label_waypoint_offscreen = true, 161 | chat_mouse = true, 162 | mate_interact = true, 163 | ammo_pickup = true, 164 | show_loot = true, 165 | hostages = true, 166 | pagers = true, 167 | outlines = true, 168 | health_jokers = true, 169 | show_interact = true, 170 | scoreboard_blur = true, 171 | scoreboard = true, 172 | scoreboard_accuracy = true, 173 | scoreboard_delay = false, 174 | scoreboard_character = true, 175 | scoreboard_skills = true, 176 | scoreboard_specials = true, 177 | scoreboard_civs = true, 178 | scoreboard_downs = true, 179 | scoreboard_downs_no_reset = false, 180 | scoreboard_weapons = true, 181 | scoreboard_armor = true, 182 | scoreboard_perk = true, 183 | scoreboard_playtime = true, 184 | scoreboard_ping = true, 185 | scoreboard_toggle = 1, 186 | save_warning = false, 187 | presenter_sound = false, 188 | hint_color = true, 189 | hint_anim = true, 190 | vape_hints = true, 191 | blackscreen_map = true, 192 | blackscreen_risk = true, 193 | blackscreen_skull = true, 194 | blackscreen_linger = true, 195 | scoreboard_maxlevel = true, 196 | joining_rank = true, 197 | joining_time = true, 198 | joining_border = true, 199 | joining_mods = false, 200 | joining_drawing = true, 201 | voice_name = true, 202 | joining_anim = 4, 203 | blackscreen_time = 0, 204 | scoreboard_skins = 2, 205 | scoreboard_kills = 3, 206 | show_objectives = 3, 207 | subtitles_bg = 2, 208 | show_timer = 3, 209 | ping_frequency = 2, 210 | jammers = 2, 211 | label_minscale = 1, 212 | hud_objective_history = 3, 213 | presenter_buffer = 5, 214 | label_minmode_dist = 7, 215 | label_minmode_dot = 1, 216 | chat_copy = 5, 217 | main_health = 2, 218 | mate_health = 2, 219 | mate_show = 3, 220 | chattime = 1, 221 | main_armor = 2, 222 | mate_armor = 1, 223 | assault_lines = 3, 224 | waypoint_radius = 200, 225 | suspicion_y = 160, 226 | interact_y = 40, 227 | main_anim_time = 0.2, 228 | mate_anim_time = 0.2 229 | --c_main_fg = {1,1,1} 230 | } 231 | end 232 | 233 | if not VoidUI.loaded then 234 | VoidUI.loaded = true 235 | VoidUI:DefaultConfig() 236 | VoidUI:Load() 237 | VoidUI:LoadTextures() 238 | end 239 | 240 | function VoidUI:GetColor(name) 241 | if VoidUI.options[name] then 242 | local color = VoidUI.options[name] 243 | return Color(unpack(color)) 244 | else 245 | return Color.white 246 | end 247 | end 248 | Hooks:Add("MenuManagerBuildCustomMenus", "MenuManagerBuildCustomMenus_VoidUI", function(menu_manager, nodes) 249 | MenuCallbackHandler.OpenVoidOptions = function(self, item) 250 | VoidUI.Menu = VoidUI.Menu or VoidUIMenu:new() 251 | VoidUI.Menu:Open() 252 | end 253 | 254 | local node = nodes["blt_options"] 255 | 256 | local item_params = { 257 | name = "VoidUI_OpenMenu", 258 | text_id = "VoidUI_options_title", 259 | help_id = "VoidUI_options_desc", 260 | callback = "OpenVoidOptions", 261 | localize = true, 262 | } 263 | local item = node:create_item({type = "CoreMenuItem.Item"}, item_params) 264 | node:add_item(item) 265 | 266 | local menus = file.GetFiles(VoidUI.mod_path.. "menu/") 267 | for i= 1, #menus do 268 | table.insert(VoidUI.menus, VoidUI.mod_path .. "menu/"..menus[i]) 269 | end 270 | end) 271 | 272 | if RequiredScript then 273 | local requiredScript = RequiredScript:lower() 274 | if VoidUI.hook_files[requiredScript] then 275 | for _, file in ipairs(VoidUI.hook_files[requiredScript]) do 276 | dofile( VoidUI.mod_path .. "lua/" .. file ) 277 | end 278 | end 279 | end 280 | 281 | if MenuManager then 282 | function MenuManager:toggle_chatinput() 283 | if Application:editor() then 284 | return 285 | end 286 | if game_state_machine and game_state_machine:current_state_name() == "editor" then 287 | return 288 | end 289 | if SystemInfo:platform() ~= Idstring("WIN32") then 290 | return 291 | end 292 | if self:active_menu() then 293 | return 294 | end 295 | if not managers.network:session() then 296 | return 297 | end 298 | if managers.hud then 299 | managers.hud:toggle_chatinput() 300 | return true 301 | end 302 | end 303 | end 304 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # VoidUI 2 | VoidUI is a UI mod for PAYDAY 2. It features an overhaul of the default HUD 3 | 4 | ## Whats new in Version 1.2.9.15 (2024.04.18) 5 | - Made the HUD textures look the same regardless of the games texture settings 6 | - If you have two Void folders in the mods folder, delete the VoidUI folder and restart the game and update though the in game updater 7 | 8 | ## Credits 9 | - Most of the hud made by Xeletron 10 | - Bug fixes and maintenance by test1 11 | - Small lua tweaks by Fanged Hex 12 | - English language localization tweaks by VxWolf 13 | - Russian localization made by Skyfrost and Borderkeeper 14 | - French localization made by Esawo 15 | - Chinese localization made by CoolLKK 16 | - Italian localization made by LycanCHKN 17 | - Korean localization made by soulls00 18 | 19 | ## Installing 20 | - Download and install [SuperBLT](https://superblt.znix.xyz) 21 | - Download 'VoidUI.zip'. Drop the 'VoidUI-master' folder in the archive into your 'mods' folder. 22 | - If the game is running, restart it. 23 | 24 | ## GNU General Public License 25 | This program is free software: you can redistribute it and/or modify 26 | it under the terms of the GNU General Public License as published by 27 | the Free Software Foundation, either version 3 of the License, or 28 | (at your option) any later version. 29 | 30 | This program is distributed in the hope that it will be useful, 31 | but WITHOUT ANY WARRANTY; without even the implied warranty of 32 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 33 | GNU General Public License for more details. 34 | 35 | You should have received a copy of the GNU General Public License 36 | along with this program (LICENSE file). If not, see . 37 | 38 | 39 | -------------------------------------------------------------------------------- /guis/textures/VoidUI/hud_badges.texture: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pd2VoidTeam/VoidUI/ecf6f3262eba591c0fc1f74386fe5aafe93dcc43/guis/textures/VoidUI/hud_badges.texture -------------------------------------------------------------------------------- /guis/textures/VoidUI/hud_extras.texture: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pd2VoidTeam/VoidUI/ecf6f3262eba591c0fc1f74386fe5aafe93dcc43/guis/textures/VoidUI/hud_extras.texture -------------------------------------------------------------------------------- /guis/textures/VoidUI/hud_health.texture: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pd2VoidTeam/VoidUI/ecf6f3262eba591c0fc1f74386fe5aafe93dcc43/guis/textures/VoidUI/hud_health.texture -------------------------------------------------------------------------------- /guis/textures/VoidUI/hud_highlights.texture: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pd2VoidTeam/VoidUI/ecf6f3262eba591c0fc1f74386fe5aafe93dcc43/guis/textures/VoidUI/hud_highlights.texture -------------------------------------------------------------------------------- /guis/textures/VoidUI/hud_weapons.texture: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pd2VoidTeam/VoidUI/ecf6f3262eba591c0fc1f74386fe5aafe93dcc43/guis/textures/VoidUI/hud_weapons.texture -------------------------------------------------------------------------------- /loc/korean.json: -------------------------------------------------------------------------------- 1 | { 2 | "VoidUI_endless_assault" : "끝없는 경찰 돌입", 3 | "VoidUI_jowi" : "윅", 4 | "VoidUI_chico" : "토니", 5 | "VoidUI_assault_1" : "메딕백을 찾는 어리석은 변질자", 6 | "VoidUI_assault_2" : "이 메시지는 진짜입니다", 7 | "VoidUI_assault_3" : "엉덩이를 끝내기 위해 캡틴을 먹어라", 8 | "VoidUI_assault_4" : ":csdmad:", 9 | "VoidUI_assault_5" : "어쨌든 이 티커는 얼마나 오래가요?", 10 | "VoidUI_assault_6" : "경보기가 울렸어, 시작이야", 11 | "VoidUI_assault_7" : "클로커와 불도저 소환중", 12 | "VoidUI_assault_8" : "믿을 수 없는 빠른 속도로 매우 빠른 VR 히스터 탭", 13 | "VoidUI_assault_9" : "지난 몇 년 동안 이 엉터리 모델에 관심을 보여 주신 모든 분들께 감사드립니다 <3", 14 | "VoidUI_assault_10" : "젠장, 그 망할 요리사들이 필요했어", 15 | "VoidUI_assault_11" : "VoidUI는 이제 에픽게임즈 스토어 독점입니다", 16 | "VoidUI_assault_12" : "사망회귀한", 17 | "VoidUI_assault_13" : "잘 자라 아메리카!", 18 | "VoidUI_assault_14" : "실제로 이것을 시도해 보세요", 19 | "VoidUI_assault_15" : "iceman78772를 위한 무료 카르마", 20 | "VoidUI_assault_16" : "당신은 모드사용으로 치트를 쓰고있습니다", 21 | "VoidUI_assault_17" : "지역 스트리머가 재미있는 이스터 에그 라인이 되다", 22 | "VoidUI_assault_18" : "우리는 Hoxton을 되찾아야 한다", 23 | "VoidUI_assault_19" : "GTFO도 시도해 보십시오", 24 | "VoidUI_assault_20" : "사격 개시!", 25 | "VoidUI_assault_21" : "당신은 게임에서 쫓겨났습니다", 26 | "VoidUI_assault_22" : "비밀 돌입 메시지는 겉만 번지르르한 것이다", 27 | "VoidUI_assault_23" : "충돌 횟수가 60% 증가했습니다", 28 | "VoidUI_assault_24" : "안정적인 30FPS로 작동중", 29 | "VoidUI_assault_25" : "계란", 30 | "VoidUI_assault_26" : "돌입 배너가 뜨기전에 무릎을 꿇으십시오!", 31 | 32 | "VoidUI_options_title" : "Void UI", 33 | "VoidUI_options_desc" : "Void UI의 모양과 느낌 사용자 지정", 34 | "VoidUI_ingame_hud" : "인게임 허드", 35 | "VoidUI_interface" : "유저 인터페이스", 36 | "VoidUI_extras" : "엑스트라", 37 | "VoidUI_hud_scale_title" : "글로벌 허드 규모", 38 | "VoidUI_hud_scale_desc" : "모든 허드 요소의 규모입니다 \n요소의 크기를 별도로 조정할 수도 있습니다", 39 | "VoidUI_outlines_title" : "조커별 색상 윤곽선", 40 | "VoidUI_outlines_desc" : "전향한 경찰들의 윤곽이 주인의 색깔과 일치하도록 합니다", 41 | "VoidUI_assault_lines_title" : "돌입 경보", 42 | "VoidUI_assault_lines_desc" : "다음 공격이 임박했음을 경고하는 내레이터 응답을 추가합니다\n\n[사용 안 함: 알림 안 함]\n[가볍게: 30초 경고]\n[표준: 30초, 20초, 10초 경고]", 43 | "VoidUI_reset_title" : "리셋 옵션", 44 | "VoidUI_reset_desc" : "모든 옵션을 기본값으로 재설정", 45 | "VoidUI_reset_confirm" : "Void UI를 기본 구성으로 재설정하시겠습니까? 이것은 되돌릴 수 없습니다", 46 | "VoidUI_warning_title" : "옵션 변경", 47 | "VoidUI_warning_desc" : "변경 내용 중 일부는 다음 하이스트 시까지 적용되지 않을 수 있습니다", 48 | "VoidUI_warning_confirm" : "다시 경고 안 함", 49 | "VoidUI_tooltip_reset" : "기본값으로 설정 $BTN_RESET", 50 | "VoidUI_tooltip_reset_cnt" : "$BTN_RESET 기본값으로 설정", 51 | "VoidUI_tooltip_steps" : "$BTN_STEP 큰 단계", 52 | 53 | "VoidUI_hudteammate_title" : "플레이어 및 팀원 패널", 54 | "VoidUI_hudteammate_desc" : "귀하와 동료의 허드 패널 관련 옵션", 55 | "VoidUI_teammate_panels_title" : "플레이어 및 팀 동료 패널 사용", 56 | "VoidUI_teammate_panels_decs" : "보이드 UI의 사용자 지정 플레이어 및 팀 동료 패널 사용", 57 | 58 | "VoidUI_main_panel" : "메인 플레이어 패널", 59 | "VoidUI_main_scale_title" : "플레이어 패널 규모", 60 | "VoidUI_main_scale_desc" : "허드 패널의 규모", 61 | "VoidUI_main_health_title" : "체력 값 표시", 62 | "VoidUI_main_health_desc" : "이모드는 현재 체력값을 표시해줍니다\n\n[사용 안 함: 표시 안 함]\n[퍼센테이지: 현재/전체 상태의 퍼센테이지]\n[실제 값: 현재 보유하고 있는 실제 체력의 양]", 63 | "VoidUI_main_anim_time_title" : "체력 애니메이션 시간", 64 | "VoidUI_main_anim_time_desc" : "치료/손상 발생 시 상태 변화 애니메이션의 시간(초당)", 65 | "VoidUI_armor_title" : "아머 값 보여주기", 66 | "VoidUI_armor_desc" : "이모드는 현재 아머값을 표시해줍니다\n\n[사용 안 함: 표시 안 함]\n[퍼센테이지: 현재/총 방어구 퍼센테이지]\n[실제 값: 현재 보유하고 있는 실제 아머량]", 67 | "VoidUI_total_title" : "실제 총알", 68 | "VoidUI_total_decs" : "총 탄약 대신 예비 탄약의 양을 표시합니다", 69 | "VoidUI_main_loud_title" : "다운수 표시", 70 | "VoidUI_main_loud_desc" : "유치장에 가기전에 남은 다운수를 표시합니다 (라우드만)", 71 | "VoidUI_main_stealth_title" : "바디백 표시", 72 | "VoidUI_main_stealth_desc" : "남은 바디백 수 표시(스텔스 전용)", 73 | "VoidUI_ammo_pickup_title" : "탄약 픽업 표시", 74 | "VoidUI_ammo_pickup_desc" : "주운 탄약의 양을 표시합니다", 75 | "VoidUI_main_fg_title" : "전경 색상", 76 | "VoidUI_main_fg_desc" : "메인 플레이어 패널에 있는 윤곽선, 텍스트 및 장비 아이콘의 색상", 77 | 78 | "VoidUI_mate_panel" : "팀원 패널", 79 | "VoidUI_mate_scale_title" : "팀원 패널 규모", 80 | "VoidUI_mate_scale_desc" : "팀원들의 허드 패널 크기", 81 | "VoidUI_mate_health_desc" : "이모드는 팀원들의 체력 값을 표시해줍니다\n\n[사용 안 함: 표시 안 함]\n[퍼센테이지: 현재/전체 체력의 퍼센테이지]\n[실제 값: 현재 보유하고 있는 실제 체력량]", 82 | "VoidUI_mate_anim_time_desc" : "치료/대미지 입을시 팀원들의 체력 변화 애니메이션 시간(초당)", 83 | "VoidUI_mate_armor_desc" : "이모드는 팀원들의 현재 방어구 값을 표시해줍니다\n\n[사용 안 함: 표시 안 함]\n[퍼센테이지: 현재/총 아머의 퍼센테이지]\n[실제 가치: 현재 보유하고 있는 실제 아머량]", 84 | "VoidUI_mate_loud_title" : "다운수 표시", 85 | "VoidUI_mate_loud_desc" : "팀원들이 구류되기 전에 남은 다운타임을 표시합니다(라우드만)", 86 | "VoidUI_mate_stealth_title" : "발각 위협도 표시", 87 | "VoidUI_mate_stealth_desc" : "체력바에 팀원들의 발각 위협도 표시(스텔스 전용)", 88 | "VoidUI_mate_name_title" : "플레이어 랭크 및 레벨 표시", 89 | "VoidUI_mate_name_desc" : "팀원의 악명 등급 및 플레이어 이름 앞에 레벨 표시", 90 | "VoidUI_mate_interact_title" : "상호작용 시간", 91 | "VoidUI_mate_interact_desc" : "팀원 상호 작용의 남은 시간 표시", 92 | "VoidUI_mate_show_title" : "팀원 패널 표시", 93 | "VoidUI_mate_show_desc" : "팀원 패널이 표시되는 방법 \n\n[숨기기: 팀원들에게 허드 패널을 보여주지 않습니다]\n[플레이어만: AI 팀원 허드 패널 숨기기]\n[표시: AI와 플레이어 팀원 모두를 위한 허드 패널 표시]", 94 | "VoidUI_fire_auto" : "자동", 95 | "VoidUI_fire_semi" : "반자동", 96 | "VoidUI_fire_burst" : "버스트", 97 | 98 | "VoidUI_objectives_title" : "습격 타이머 & 목표 ", 99 | "VoidUI_objectives_desc" : "습격 타이머 및 목표패널 설정", 100 | "VoidUI_objectives_scale_title" : "패널 규모", 101 | "VoidUI_objectives_scale_desc" : "하이스트 타이머와 오브젝트 둘의 규모", 102 | "VoidUI_objectives_show_timer_title" : "하이스트 타이머 보기", 103 | "VoidUI_objectives_show_timer_desc" : "타이머 패널 표시 또는 숨기기 \n\n[숨기기: 표시 안 함]\n[탭 화면: 탭 화면이 열려 있는 동안만 표시]\n[보기: 항상 표시]", 104 | "VoidUI_timer_panel" : "습격 타이머", 105 | "VoidUI_enable_timer_title" : "타이머 패널 사용", 106 | "VoidUI_enable_timer_desc" : "Void UI의 사용자 지정 하이스트 타이머 사용", 107 | "VoidUI_levelname_title" : "하이스트의 날짜", 108 | "VoidUI_levelname_desc" : "하이스트의 현재 날짜 이름 표시", 109 | "VoidUI_ghost_title" : "스텔스 아이콘 표시", 110 | "VoidUI_ghost_desc" : "스텔스하는것인지 아닌지 표시합니다 실패시 빨간유령이 됩니다 ", 111 | "VoidUI_loot_title" : "확보한 전리품 표시", 112 | "VoidUI_loot_desc" : "하이스트 진행 동안 확보한 전리품 수 표시", 113 | "VoidUI_objectives_panel" : "오브젝트 패널", 114 | "VoidUI_enable_objectives_title" : "오브젝트 패널 활성화", 115 | "VoidUI_enable_objectives_desc" : "Void UI의 사용자 지정 목표 패널 사용", 116 | "VoidUI_objective_history_title" : "오브젝트 내역", 117 | "VoidUI_objective_history_desc" : "표시할 수 있는 과거 오브젝트의 양", 118 | "VoidUI_objectives_show_title" : "오브젝트 패널 표시", 119 | "VoidUI_objectives_show_desc" : "오브젝트 패널 표시 또는 숨기기 \n\n[숨기기: 표시 안 함]\n[탭 화면: 탭 화면이 열려 있는 동안만 표시]\n[보기: 항상 표시]", 120 | 121 | "VoidUI_assault_title" : "돌입 패널", 122 | "VoidUI_assault_desc" : "돌입 패널 관련 옵션", 123 | "VoidUI_enable_assault_title" : "돌입 패널 사용", 124 | "VoidUI_enable_assault_decs" : "Void UI의 사용자 지정 공격 패널 사용", 125 | "VoidUI_assault_scale_title" : "패널 규모", 126 | "VoidUI_assault_scale_desc" : "돌입 패널 규모", 127 | "VoidUI_badge_title" : "경찰 뱃지", 128 | "VoidUI_badge_desc" : "돌입 중 경찰 뱃지 아이콘 표시", 129 | "VoidUI_badge_anim_title" : "뱃지 펄스 애니메이션", 130 | "VoidUI_badge_anim_desc" : "화려한 '맥박' 효과로 경찰 배지를 애니메이션화합니다", 131 | "VoidUI_hostages_title" : "인질 구분", 132 | "VoidUI_hostages_desc" : "민간인 및 경찰 인질들을 별도의 패널에 표시(라우드만)", 133 | "VoidUI_pagers_title" : "남은 페이저 표시", 134 | "VoidUI_pagers_desc" : "남은 페이저 수 표시(스텔스 전용)\n이 기능이 올바르게 작동하려면 처음부터 하이스트를 플레이해야 합니다", 135 | "VoidUI_jammer_title" : "재머 타이머 표시", 136 | "VoidUI_jammer_desc" : "배치된 ECM 재머의 배터리 수명 표시(스텔스만)\n\n[숨기기: 표시 안 함]\n[먼저 놓인것 표시: 여러 재머가 활성 상태인 경우 가장 오래된 재머 표시]\n[나중에 놓인것 표시: 여러 재머가 활성 상태인 경우 새 재머 표시]", 137 | 138 | "VoidUI_chat_clipboard" : "메시지가 클립보드에 복사됨", 139 | "VoidUI_chat_title" : "플레이어 채팅", 140 | "VoidUI_chat_desc" : "플레이어 대화와 관련된 옵션", 141 | "VoidUI_text_chat" : "텍스트 채팅", 142 | "VoidUI_enable_chat_title" : "텍스트 대화 사용", 143 | "VoidUI_enable_chat_decs" : "Void UI의 사용자 지정 텍스트 대화 사용", 144 | "VoidUI_chat_scale_title" : "채팅 규모", 145 | "VoidUI_chat_scale_desc" : "플레이어 채팅의 규모", 146 | "VoidUI_chat_mouse_title" : "마우스 사용", 147 | "VoidUI_chat_mouse_desc" : "채팅을 사용할 때 마우스 잠금을 해제합니다 마우스 잠금을 해제하면 더 쉽게 스크롤하고 메시지를 복사할 수 있습니다", 148 | "VoidUI_charactername_title" : "하이스터 표시", 149 | "VoidUI_charactername_desc" : "메시지 보낸 사람이 어떤 하이스터인지 플레이중 괄호 안에 표시", 150 | "VoidUI_chattime_title" : "시간 표시", 151 | "VoidUI_chattime_desc" : "메시지를 보낸 시간을 표시합니다 \n\n[숨기기: 표시 안 함]\n[게임 시간: 현재 하이스트가 시작된 이후의 시간]\n[시스템 시간: PC에 표시되는 실시간 시간]", 152 | "VoidUI_chat_copy_title" : "메시지 복사", 153 | "VoidUI_chat_copy_desc" : "마우스 오른쪽 단추를 누를 때 클립보드에 복사되는 대화 메시지 부분", 154 | "VoidUI_voice_chat" : "보이스 챗", 155 | "VoidUI_enable_voice_title" : "보이스 채팅 패널을 활성화합니다", 156 | "VoidUI_enable_voice_decs" : "Void UI의 맞춤형 음성채팅으로 표시해줍니다", 157 | "VoidUI_voice_scale_title" : "인디케이터 규모", 158 | "VoidUI_voice_scale_desc" : "채터 인디케이터의 규모를 표시합니다", 159 | "VoidUI_voice_name_title" : "이름보이기", 160 | "VoidUI_voice_name_desc" : "채팅하는 유저의 닉네임 표시합니다", 161 | 162 | "VoidUI_label_title" : "라벨과 웨이포인트", 163 | "VoidUI_label_desc" : "떠있는 라벨과 웨이포인트 관련 옵션", 164 | "VoidUI_label" : "이름 라벨", 165 | "VoidUI_enable_labels_title" : "이름 라벨 사용", 166 | "VoidUI_enable_labels_desc" : "Void UI의 사용자 지정 이름 라벨 사용", 167 | "VoidUI_jokernames_title" : "조커 라벨", 168 | "VoidUI_jokernames_desc" : "전환된 경찰에 대한 이름 라벨 추가", 169 | "VoidUI_jokerhealth_title" : "조커 체력", 170 | "VoidUI_jokerhealth_desc" : "이름 라벨에 전환된 경찰의 체력 표시", 171 | "VoidUI_label_scale_title" : "이름 라벨 규모", 172 | "VoidUI_label_scale_desc" : "이름 라벨의 규모", 173 | "VoidUI_label_upper_title" : "대문자 이름", 174 | "VoidUI_label_upper_desc" : "이름을 모두 대문자로 표시", 175 | "VoidUI_minlabel_title" : "라벨 최소화 모드(최소화 모드)", 176 | "VoidUI_minlabel_desc" : "이름 라벨은 소유자가 멀리 있거나 사용자가 직접 보지 않을 때 더 작아집니다", 177 | "VoidUI_label_minscale_title" : "이름 라벨 최소화 모드 규모", 178 | "VoidUI_label_minscale_desc" : "최소화 모드에서 이름 라벨의 규모", 179 | "VoidUI_minrank_title" : "최소화 모드에서 등급 및 레벨 표시", 180 | "VoidUI_minrank_desc" : "레이블이 최소화 모드일 때 팀원들의 악명 등급 및 플레이어 레벨 표시", 181 | "VoidUI_mindist_title" : "최소화 모드 거리", 182 | "VoidUI_mindist_desc" : "이름 레이블이 최소화 모드로 전환되어야 하는 거리(미터당)", 183 | "VoidUI_mindot_title" : "최소화 모드 영역 규모 사용 안 함", 184 | "VoidUI_mindot_desc" : "라벨에서 최소화 모드를 일시적으로 비활성화하려면 다른 플레이어를 직접 봐야 합니다", 185 | "VoidUI_waypoints" : "웨이포인트", 186 | "VoidUI_enable_waypoints_title" : "웨이포인트 활성화 ", 187 | "VoidUI_enable_waypoints_desc" : "Void UI의 사용자 지정 웨이포인트 활성화", 188 | "VoidUI_waypoint_scale_title" : "웨이포인트 규모", 189 | "VoidUI_waypoint_scale_desc" : "객관적인 웨이포인트 및 인식 마커의 규모", 190 | "VoidUI_waypoint_radius_title" : "오프스크린 웨이포인트 오프셋", 191 | "VoidUI_waypoint_radius_desc" : "소스가 보이지 않을 때 화면 중앙에서 오프스크린 웨이포인트가 얼마나 멀리 떨어져 있는지 보여줍니다", 192 | "VoidUI_waypoint_offscreen_title" : "오프스크린 웨이포인트 표시", 193 | "VoidUI_waypoint_offscreen_desc" : "소스가 보이지 않을 때 웨이포인트 표시", 194 | 195 | "VoidUI_interact_title" : "상호 작용 및 감지", 196 | "VoidUI_interact_desc" : "상호 작용 패널 및 발각 패널과 관련된 옵션", 197 | "VoidUI_interact" : "상호작용 패널", 198 | "VoidUI_enable_interact_title" : "상호작용 패널 활성화", 199 | "VoidUI_enable_interact_desc" : "Void UI의 사용자 정의 상호 작용 패널 활성화", 200 | "VoidUI_interact_scale_title" : "상호작용 규모", 201 | "VoidUI_interact_scale_desc" : "상호작용 패널의 규모", 202 | "VoidUI_interact_y_title" : "상호작용 패널 Y 위치", 203 | "VoidUI_interact_y_desc" : "화면 중앙에서 상호작용 패널의 수직 위치", 204 | "VoidUI_interacttime_title" : "상호작용 시간", 205 | "VoidUI_interacttime_desc" : "상호작용의 남은 시간을 표시합니다", 206 | "VoidUI_suspicion" : "발각 패널", 207 | "VoidUI_enable_suspicion_title" : "발각 패널 활성화", 208 | "VoidUI_enable_suspicion_desc" : "Void UI의 커스텀 스텔스 발각 패널 활성화", 209 | "VoidUI_suspicion_y_title" : "발각 패널 Y 위치", 210 | "VoidUI_suspicion_y_desc" : "화면 중앙에서 발각 패널의 수직 위치", 211 | "VoidUI_suspicion_scale_title" : "발각 규모", 212 | "VoidUI_suspicion_scale_desc" : "발각 패널의 규모", 213 | 214 | "VoidUI_stats_title" : "통계 화면", 215 | "VoidUI_stats_desc" : "TAB 통계 화면 관련 옵션", 216 | "VoidUI_enable_stats_title" : "통계 화면 활성화", 217 | "VoidUI_enable_stats_desc" : "Void UI의 사용자 정의 통계 화면 활성화", 218 | "VoidUI_scoreboard_scale_title" : "통계 패널 규모", 219 | "VoidUI_scoreboard_scale_desc" : "통계 패널의 규모", 220 | "VoidUI_blur_title" : "배경화면 블러", 221 | "VoidUI_blur_desc" : "통계 패널이 열려 있을 때 배경 흐리게 처리", 222 | "VoidUI_scoreboard_maxlevel_title" : "최대 레벨일 때 xp 표시", 223 | "VoidUI_scoreboard_maxlevel_desc" : "레벨 100일 때 경험치 표시줄 표시", 224 | "VoidUI_scoreboard" : "스코어보드", 225 | "VoidUI_scoreboard_title" : "스코어보드 활성화", 226 | "VoidUI_scoreboard_desc" : "당신과 당신의 팀원에 대한 통계를 볼 수 있는 통계 화면에 스코어보드를 추가하세요", 227 | "VoidUI_scoreboard_accuracy_title" : "명중률 표시", 228 | "VoidUI_scoreboard_accuracy_desc" : "현재진행중인 날짜의 적중 정확도 표시", 229 | "VoidUI_scoreboard_delay_title" : "거래 지연 표시", 230 | "VoidUI_scoreboard_delay_desc" : "구금된 경우 거래되기까지 얼마나 기다려야 하는지 보여줍니다", 231 | "VoidUI_scoreboard_character_title" : "하이스터 표시", 232 | "VoidUI_scoreboard_character_desc" : "플레이어가 플레이하고 있는 하이스터의 가면을 보여줍니다", 233 | "VoidUI_scoreboard_skills_title" : "스킬 표시", 234 | "VoidUI_scoreboard_skills_desc" : "플레이어가 각 스킬 트리에서 사용한 스킬 포인트 수 표시", 235 | "VoidUI_scoreboard_kills_title" : "킬수 표시", 236 | "VoidUI_scoreboard_kills_desc" : "플레이어가 죽인 경찰관의 수를 표시합니다\n\n[사용 안 함: 표시 안 함]\n[특수 제외: 죽인 특수 킬을 일반 킬로 계산하지 않음]\n[특수 기능 포함: 특수 기능을 일반 킬로 카운트]", 237 | "VoidUI_scoreboard_specials_title" : "특경 킬수 표시", 238 | "VoidUI_scoreboard_specials_desc" : "플레이어가 죽인 특수 경찰의 양 표시", 239 | "VoidUI_scoreboard_civs_title" : "시민 킬 표시", 240 | "VoidUI_scoreboard_civs_desc" : "플레이어가 죽인 시민 수 표시", 241 | "VoidUI_scoreboard_downs_title" : "다운 횟수 표시", 242 | "VoidUI_scoreboard_downs_desc" : "플레이어가 다운된 횟수 표시", 243 | "VoidUI_scoreboard_downs_no_reset_title" : "Show Total Downs", 244 | "VoidUI_scoreboard_downs_no_reset_desc" : "Shows the total amount of downs per heist", 245 | "VoidUI_scoreboard_weapons_title" : "무기/봇의 마스크 표시", 246 | "VoidUI_scoreboard_weapons_desc" : "플레이어의 기본, 보조(봇용 마스크) 및 근거리 무기 표시", 247 | "VoidUI_scoreboard_armor_title" : "아머 표시", 248 | "VoidUI_scoreboard_armor_desc" : "플레이어의 장비된 아머를 보여줍니다", 249 | "VoidUI_scoreboard_skins_title" : "무기스킨 표시", 250 | "VoidUI_scoreboard_skins_desc" : "플레이어의 무기에 적용된 스킨 표시\n\n[사용 안 함: 무기 스킨을 보여주지 않음]\n[레어도: 무기 뒤에 스킨 레어도 아이콘 표시]\n[레어도 없음: 스킨 레어도 아이콘을 표시하지 않음]", 251 | "VoidUI_scoreboard_perk_title" : "퍽과 크루능력 표시", 252 | "VoidUI_scoreboard_perk_desc" : "장착된 퍽 덱과 플레이어의 레벨 표시(봇의 경우 크루 능력)", 253 | "VoidUI_scoreboard_playtime_title" : "플레이타임 및 크루부스트 표시", 254 | "VoidUI_scoreboard_playtime_desc" : "프로필 및 게임 시간이 공개되어 있는 경우 플레이어의 페이데이 시간 표시(봇의 경우 크루 부스트)", 255 | "VoidUI_scoreboard_ping_title" : "지연 시간/ping 표시", 256 | "VoidUI_scoreboard_ping_desc" : "다른 플레이어 대기 시간 표시", 257 | "VoidUI_ping_frequency_title" : "지연 시간 업데이트 빈도", 258 | "VoidUI_ping_frequency_desc" : "ping 값이 업데이트되는 빈도(초당)", 259 | "VoidUI_scoreboard_toggle_title" : "토글 버튼", 260 | "VoidUI_scoreboard_toggle_desc" : "점수판과 추적된 도과 사이를 전환하는 버튼", 261 | "VoidUI_error" : "스팀 오류", 262 | "VoidUI_private" : "비공개 프로필", 263 | "VoidUI_hidden" : "플레이타임 가림", 264 | "VoidUI_player" : "플레이어", 265 | "VoidUI_kills" : "처치수", 266 | "VoidUI_specials" : "스페셜", 267 | "VoidUI_civs" : "시민", 268 | "VoidUI_downs" : "다운수", 269 | "VoidUI_perk" : "퍽덱", 270 | "VoidUI_playtime" : "플레이타임", 271 | "VoidUI_ping" : "핑", 272 | "VoidUI_nosong" : "아무것도 아닌", 273 | 274 | "VoidUI_presenter_title" : "알림", 275 | "VoidUI_presenter_desc" : "hud 알림 관련 옵션", 276 | "VoidUI_enable_presenter_title" : "프레젠터 알림 사용", 277 | "VoidUI_enable_presenter_desc" : "Void UI의 사용자 지정 프레젠터 알림 사용", 278 | "VoidUI_presenter_scale_title" : "알림 패널 규모", 279 | "VoidUI_presenter_scale_desc" : "프레젠터 알림 패널의 규모", 280 | "VoidUI_presenter_buffer_title" : "최대 프레젠터", 281 | "VoidUI_presenter_buffer_desc" : "동시에 볼 수 있는 최대 알림 양", 282 | "VoidUI_presenter_sound_title" : "알림 소리 사용 안 함", 283 | "VoidUI_presenter_sound_desc" : "힌트 및 알림이 나타날 때 효과음 재생 사용 안 함", 284 | "VoidUI_presenter_panel" : "프레젠터 알림", 285 | "VoidUI_hint_panel" : "힌트 알림", 286 | "VoidUI_enable_hint_title" : "힌트 패널을 사용하도록 설정합니다", 287 | "VoidUI_enable_hint_desc" : "보이드 UI의 사용자 지정 힌트 패널을 사용하십시오", 288 | "VoidUI_hint_scale_title" : "텍스트 규모", 289 | "VoidUI_hint_scale_desc" : "힌트 텍스트의 규모", 290 | "VoidUI_hint_anim_title" : "힌트 애니메이션", 291 | "VoidUI_hint_anim_desc" : "화려한 '점프 아웃' 효과의 애니메이션 힌트", 292 | "VoidUI_hint_color_title" : "힌트 색상", 293 | "VoidUI_hint_color_desc" : "힌트에서 팀 동료 이름 색 지정", 294 | "VoidUI_vape_hints_title" : "태그팀 알림", 295 | "VoidUI_vape_hints_desc" : "태그 팀별로 태그를 지정할 때 힌트 알림을 표시합니다 또한 몇 초의 긴 윤곽선을 추가합니다", 296 | "VoidUI_challanges_panel" : "챌린지 알림", 297 | "VoidUI_enable_challanges_title" : "챌린지 알림 사용", 298 | "VoidUI_enable_challanges_desc" : "Void UI의 사용자 지정 질문 알림 사용", 299 | "VoidUI_hint_challanges_desc" : "챌린지 알림 패널 규모", 300 | 301 | "VoidUI_tag_team_owner" : "당신은 태그되었습니다 $NAME!", 302 | "VoidUI_tag_team_owner_joker" : "다음의 조커에 태그를 지정했습니다 $NAME!", 303 | "VoidUI_tag_team_tagged" : "$NAME 태그했습니다!", 304 | 305 | "VoidUI_subtitles_title" : "자막", 306 | "VoidUI_subtitles_desc" : "자막 관련 옵션", 307 | "VoidUI_enable_subtitles_title" : "자막 사용", 308 | "VoidUI_enable_subtitles_desc" : "Void UI의 사용자 지정 자막 사용", 309 | "VoidUI_subtitle_scale_title" : "자막 크기", 310 | "VoidUI_subtitle_scale_desc" : "자막의 크기", 311 | "VoidUI_subtitles_bg_title" : "배경화면 스타일", 312 | "VoidUI_subtitles_bg_desc" : "자막의 배경 스타일\n\n[사용 안 함: 배경 없음]\n[드롭 섀도: 자막에 그림자 텍스트를 제공합니다]\n[단색: 자막의 배경에는 색 상자가 있습니다]", 313 | 314 | "VoidUI_blackscreen_title" : "하이스터 소개 및 로드 화면", 315 | "VoidUI_blackscreen_desc" : "하이스트 인트로(검은 화면) 및 로딩 화면 관련 옵션", 316 | "VoidUI_blackscreen" : "하이스트 인트로", 317 | "VoidUI_enable_blackscreen_title" : "하이스트 인트로 사용", 318 | "VoidUI_enable_blackscreen_desc" : "Void UI의 사용자 지정 하이스트 인트로(검은 화면) 사용", 319 | "VoidUI_blackscreen_map_title" : "현재 날짜 표시", 320 | "VoidUI_blackscreen_map_desc" : "하이스트의 현재 날짜 이름 표시", 321 | "VoidUI_blackscreen_risk_title" : "난이도 이름 표시", 322 | "VoidUI_blackscreen_risk_desc" : "현재 플레이 중인 난이도의 이름 표시", 323 | "VoidUI_blackscreen_skull_title" : "난이도 아이콘 표시", 324 | "VoidUI_blackscreen_skull_desc" : "난이도에 따라 아이콘 표시", 325 | "VoidUI_blackscreen_linger_title" : "하이스트 인트로에서 페이드", 326 | "VoidUI_blackscreen_linger_desc" : "게임에 대한 하이스트 소개에서 페이드", 327 | "VoidUI_blackscreen_time_title" : "인트로 타임 스킵", 328 | "VoidUI_blackscreen_time_desc" : "소개를 건너뛸 때까지 Enter 키를 누르고 있어야 하는 시간", 329 | "VoidUI_skip_blackscreen" : "누르세요 $BTN_ACCEPT 스킵하기위해서", 330 | "VoidUI_loading_others" : "그리고 $PLAYERS 누군가", 331 | "VoidUI_loading" : "로딩 스크린", 332 | "VoidUI_enable_loadingscreen_title" : "화면 로드 사용", 333 | "VoidUI_enable_loadingscreen_desc" : "Void UI의 사용자 지정 로드 화면 사용", 334 | "VoidUI_loading_heistinfo_title" : "하이스트 정보", 335 | "VoidUI_loading_heistinfo_desc" : "하이스트 관련 정보(예: 이름, 계약자 및 선택된 난이도) 표시", 336 | "VoidUI_loading_players_title" : "연결된 플레이어", 337 | "VoidUI_loading_players_desc" : "연결된 플레이어의 이름 표시", 338 | "VoidUI_loading_briefing_title" : "하이스트 브리핑", 339 | "VoidUI_loading_briefing_desc" : "하이스트에 대한 계약자 브리핑을 보여줍니다", 340 | 341 | "VoidUI_joining_title" : "참가 플레이어", 342 | "VoidUI_joining_desc" : "드롭인 클라이언트 패널 참여와 관련된 옵션", 343 | "VoidUI_enable_joining_title" : "플레이어 패널 참여 사용", 344 | "VoidUI_enable_joining_desc" : "Void UI의 사용자 정의 결합 드롭다운 클라이언트 패널 사용", 345 | "VoidUI_joining_rank_desc" : "가입 플레이어의 레벨 및 악명 등급 표시", 346 | "VoidUI_joining_time_title" : "남은 시간 표시", 347 | "VoidUI_joining_time_desc" : "플레이어가 들어올 때까지 예상 시간 표시", 348 | "VoidUI_joining_border_title" : "색상 조인 패널", 349 | "VoidUI_joining_border_desc" : "전체 패널은 들어오는 플레이어 피어 색상을 사용합니다", 350 | "VoidUI_joining_anim_title" : "패널 애니메이션", 351 | "VoidUI_joining_anim_desc" : "패널의 애니메이션 스타일\n\n[정적: 애니메이션하지 않음]\n[회전 중: 패널이 천천히 왼쪽 또는 오른쪽으로 회전합니다]\n[펄스: 패널이 천천히 증가하거나 축소됩니다]\n[회전 및 펄스: 패널이 동시에 회전하고 펄스를 발생시킵니다]", 352 | "VoidUI_joining_mods_title" : "설치된 모드 표시", 353 | "VoidUI_joining_mods_desc" : "설치된 들어온 플레이어 모드 표시", 354 | "VoidUI_joining_mods_scale_title" : "모드 규모", 355 | "VoidUI_joining_mods_scale_desc" : "설치된 mods 패널의 규모", 356 | "VoidUI_joining_drawing_title" : "그림쟁이 활성화", 357 | "VoidUI_joining_drawing_desc" : "Ctrl + 왼쪽 마우스 버튼을 눌러 들어오는 화면에 그릴 수 있습니다", 358 | 359 | "VoidUI_disabled" : "숨기기", 360 | "VoidUI_ecm_first" : "먼저 놓인것", 361 | "VoidUI_ecm_last" : "나중에 놓인것", 362 | "VoidUI_health_percentage" : "퍼센테이지", 363 | "VoidUI_health_real" : "실제값", 364 | "VoidUI_gametime" : "게임 시간", 365 | "VoidUI_realtime" : "시스템 시간", 366 | "VoidUI_disable" : "비활성화", 367 | "VoidUI_chat_message" : "플레이어의 메시지만", 368 | "VoidUI_chat_name" : "플레이어: 메시지", 369 | "VoidUI_chat_character" : "하이스터: 메시지", 370 | "VoidUI_chat_name_character" : "플레이어 (하이스터): 메시지", 371 | "VoidUI_assault_lines_30sec" : "가벼운", 372 | "VoidUI_assault_lines_every10sec" : "표준", 373 | "VoidUI_nonspecial" : "특수 제외", 374 | "VoidUI_withspecial" : "특수 포함", 375 | "VoidUI_rarity" : "레어도 와", 376 | "VoidUI_norarity" : "레어도 없이", 377 | "VoidUI_on_scoreboard" :"탭스크린", 378 | "VoidUI_show" : "보기", 379 | "VoidUI_subtitles_shadow" : "드롭 섀도우", 380 | "VoidUI_subtitles_fill" : "단색", 381 | "VoidUI_jump" : "점프 키", 382 | "VoidUI_crouch" : "앉기 키", 383 | "VoidUI_rmb" : "우클릭", 384 | "VoidUI_joining_anim_off" : "정적", 385 | "VoidUI_joining_anim_rot" : "회전", 386 | "VoidUI_joining_anim_grow" : "펄스", 387 | "VoidUI_joining_anim_full" : "회전 및 펄스", 388 | "VoidUI_red" : "레드", 389 | "VoidUI_green" : "그린", 390 | "VoidUI_blue" : "블루", 391 | "VoidUI_not_ai" : "오직 플레이어만 ", 392 | 393 | "VoidUI_fire_volley" : "Volley" 394 | 395 | } 396 | -------------------------------------------------------------------------------- /loc/schinese.json: -------------------------------------------------------------------------------- 1 | { 2 | "VoidUI_endless_assault" : "无尽警方突击进行中", 3 | "VoidUI_jowi" : "威克", 4 | "VoidUI_chico" : "托尼", 5 | "VoidUI_assault_1" : "你有多少个任天堂游戏机?", 6 | "VoidUI_assault_2" : "这个消息是真实的", 7 | "VoidUI_assault_3" : "吃掉队长来结束突击", 8 | "VoidUI_assault_4" : ":我很生气:", 9 | "VoidUI_assault_5" : "这个波次到底有多久?", 10 | "VoidUI_assault_6" : "那是警报,伙计们,现在开始响了", 11 | "VoidUI_assault_7" : "正在生成小特感以及大坦克", 12 | "VoidUI_assault_8" : "消费Scrungo金币", 13 | "VoidUI_assault_9" : "现在预购收获日:大逃杀!XD", 14 | "VoidUI_assault_10" : "TMD,我们需要那些该死的制毒师", 15 | "VoidUI_assault_11" : "我希望你喜欢使用消音技能", 16 | "VoidUI_assault_12" : "死亡游戏", 17 | "VoidUI_assault_13" : "Kento在无限战争结束的时候就变成灰尘了", 18 | "VoidUI_assault_14" : "请一定要在现实生活中尝试本游戏的任何行为", 19 | "VoidUI_assault_15" : "为你的劫匪多穿点衣服有助于提高劫匪的隐匿度,因为劫匪可以把枪藏起来!", 20 | "VoidUI_assault_16" : "你因为使用过多的MOD而被判定为作弊", 21 | "VoidUI_assault_17" : "当突击横幅变成有趣的复活节横幅", 22 | "VoidUI_assault_18" : "我们得让霍斯顿回来", 23 | "VoidUI_assault_19" : "Esawo是一个笨蛋", 24 | "VoidUI_assault_20" : "着火吧!", 25 | "VoidUI_assault_21" : "你被踢除了比赛,你的结算可能会出现问题", 26 | "VoidUI_assault_22" : "隐密的突击信息是装饰品", 27 | "VoidUI_assault_23" : "现在有60%以上的概率会使游戏崩溃", 28 | "VoidUI_assault_24" : "正在以稳定的30FPS运行,启动V-Sync插件", 29 | "VoidUI_assault_25" : "在2015年,No mercy将会被取消", 30 | "VoidUI_assault_26" : "对突击横幅喊声大佬!能留意到你真是人才!", 31 | 32 | "VoidUI_options_title" : "Void UI", 33 | "VoidUI_options_desc" : "自定义Void UI的外观和感觉", 34 | "VoidUI_ingame_hud" : "游戏中HUD", 35 | "VoidUI_interface" : "用户界面", 36 | "VoidUI_extras" : "附加功能", 37 | "VoidUI_hud_scale_title" : "全部HUD比例", 38 | "VoidUI_hud_scale_desc" : "每个HUD元素的尺度。\n元素也可以分别调整大小", 39 | "VoidUI_outlines_title" : "以彩色标识变节敌人", 40 | "VoidUI_outlines_desc" : "使变节敌人的轮廓与其所有者的颜色相匹配", 41 | "VoidUI_assault_lines_title" : "突击警告", 42 | "VoidUI_assault_lines_desc" : "添加叙述者反应并警告下一次即将发生的袭击。\n\n[禁用:不要提醒]\n[简单:30秒警告]\n[标准:30秒,20秒和10秒警告]", 43 | "VoidUI_reset_title" : "重置选项", 44 | "VoidUI_reset_desc" : "将每个选项重置为默认值", 45 | "VoidUI_reset_confirm" : "你确定要将Void UI重置为默认配置吗?这不能被撤消!", 46 | "VoidUI_warning_title" : "选项已更改", 47 | "VoidUI_warning_desc" : "你的一些更改可能会在下次劫案时才会生效", 48 | "VoidUI_warning_confirm" : "不再提醒", 49 | "VoidUI_tooltip_reset" : "按下$BTN_RESET设置为默认", 50 | "VoidUI_tooltip_reset_cnt" : "$BTN_RESET绑定为默认", 51 | "VoidUI_tooltip_steps" : "$BTN_STEP快速滑动", 52 | 53 | "VoidUI_hudteammate_title" : "玩家和队友面板", 54 | "VoidUI_hudteammate_desc" : "与你和你队友HUD面板相关的选项", 55 | "VoidUI_teammate_panels_title" : "启用玩家和队友面板", 56 | "VoidUI_teammate_panels_decs" : "启用Void UI的自定义主玩家和队友面板", 57 | 58 | "VoidUI_main_panel" : "主玩家面板", 59 | "VoidUI_main_scale_title" : "玩家面板比例", 60 | "VoidUI_main_scale_desc" : "你HUD面板的比例", 61 | "VoidUI_main_health_title" : "显示生命值", 62 | "VoidUI_main_health_desc" : "显示当前生命值的模式。\n\n[禁用:不显示]\n[百分比:你当前/整体生命值的百分比]\n[实际数值:你拥有的实际生命数值]", 63 | "VoidUI_main_anim_time_title" : "生命值动画时间", 64 | "VoidUI_main_anim_time_desc" : "在治疗/受伤时,生命值变化动画的时间(以秒为单位)", 65 | "VoidUI_armor_title" : "显示护甲值", 66 | "VoidUI_armor_desc" : "显示当前护甲值的模式。\n\n[禁用:不显示]\n[百分比:你当前/整体生命值的百分比]\n[实际数值:你拥有的实际生命数值]", 67 | "VoidUI_total_title" : "真实弹药面板", 68 | "VoidUI_total_decs" : "显示备用弹药数量,而不是总弹药数量", 69 | "VoidUI_main_loud_title" : "显示倒地次数", 70 | "VoidUI_main_loud_desc" : "显示你在被拘留之前剩余的倒地次数(仅强袭)", 71 | "VoidUI_main_stealth_title" : "显示尸体袋", 72 | "VoidUI_main_stealth_desc" : "显示你剩余的尸体袋数量(仅潜入)", 73 | "VoidUI_ammo_pickup_title" : "显示拾弹量", 74 | "VoidUI_ammo_pickup_desc" : "显示你捡拾的弹药数量", 75 | "VoidUI_main_fg_title" : "前景色", 76 | "VoidUI_main_fg_desc" : "主玩家面板上轮廓,文字和装备图标的颜色", 77 | 78 | "VoidUI_mate_panel" : "队友面板", 79 | "VoidUI_mate_scale_title" : "队友面板比例", 80 | "VoidUI_mate_scale_desc" : "你队友HUD面板的比例", 81 | "VoidUI_mate_health_desc" : "显示你队友生命值的模式。\n\n[禁用:不显示]\n[百分比:他们当前/整体生命值的百分比]\n[实际数值:他们拥有的实际生命数值]", 82 | "VoidUI_mate_anim_time_desc" : "在治疗/受伤时,你队友生命值变化动画的时间(以秒为单位)", 83 | "VoidUI_mate_armor_desc" : "显示你队友护甲值的模式。\n\n[禁用:不显示]\n[百分比:他们当前/整体护甲值的百分比]\n[实际数值:他们拥有的实际护甲数值]", 84 | "VoidUI_mate_loud_title" : "显示倒地次数", 85 | "VoidUI_mate_loud_desc" : "显示你队友在被拘留之前剩余的倒地次数(仅强袭)", 86 | "VoidUI_mate_stealth_title" : "显示暴露值", 87 | "VoidUI_mate_stealth_desc" : "在他们的生命值面板中显示你队友的暴露风险(仅潜入)", 88 | "VoidUI_mate_name_title" : "显示玩家的级别和等级", 89 | "VoidUI_mate_name_desc" : "在队友的名字之前显示他们的转生次数和等级", 90 | "VoidUI_mate_interact_title" : "互动时间", 91 | "VoidUI_mate_interact_desc" : "显示队友互动的剩余时间", 92 | "VoidUI_mate_show_title" : "显示队友面板", 93 | "VoidUI_mate_show_desc" : "你队友面板的显示方式\n\n[隐藏:永远不要显示你队友的HUD面板]\n[仅玩家:隐藏AI队友面板]\n[显示:显示AI和队友的面板]", 94 | "VoidUI_fire_auto" : "全自动", 95 | "VoidUI_fire_semi" : "半自动", 96 | "VoidUI_fire_burst" : "连发", 97 | 98 | "VoidUI_objectives_title" : "劫案计时器和目标", 99 | "VoidUI_objectives_desc" : "与劫案计时器和目标面板相关的选项", 100 | "VoidUI_objectives_scale_title" : "面板比例", 101 | "VoidUI_objectives_scale_desc" : "劫案计时器和目标的比例", 102 | "VoidUI_objectives_show_timer_title" : "显示计时器面板", 103 | "VoidUI_objectives_show_timer_desc" : "显示或隐藏计时器面板\n\n[隐藏:从不显示]\n[在统计屏幕中:仅在统计屏幕打开时显示]\n[显示:始终显示]", 104 | "VoidUI_timer_panel" : "劫案计时器", 105 | "VoidUI_enable_timer_title" : "启用计时器面板", 106 | "VoidUI_enable_timer_desc" : "启用Void UI的自定义劫案计时器", 107 | "VoidUI_levelname_title" : "劫案当天名称", 108 | "VoidUI_levelname_desc" : "显示当天的劫案名称", 109 | "VoidUI_ghost_title" : "显示幽灵图标", 110 | "VoidUI_ghost_desc" : "在可潜入的关卡上显示幽灵图标。潜入失败时则会变为红色", 111 | "VoidUI_loot_title" : "显示截获战利品", 112 | "VoidUI_loot_desc" : "显示你在劫案期间截获的战利品数量", 113 | "VoidUI_objectives_panel" : "目标面板", 114 | "VoidUI_enable_objectives_title" : "启用目标面板", 115 | "VoidUI_enable_objectives_desc" : "启用Void UI的自定义目标面板", 116 | "VoidUI_objective_history_title" : "历史目标", 117 | "VoidUI_objective_history_desc" : "可以显示历史目标的数量", 118 | "VoidUI_objectives_show_title" : "显示目标面板", 119 | "VoidUI_objectives_show_desc" : "显示或隐藏目标面板\n\n[隐藏:从不显示]\n[在统计屏幕中:仅在统计屏幕打开时显示]\n[显示:始终显示]", 120 | 121 | "VoidUI_assault_title" : "突击面板", 122 | "VoidUI_assault_desc" : "与突击面板相关的选项", 123 | "VoidUI_enable_assault_title" : "启用突击面板", 124 | "VoidUI_enable_assault_decs" : "启用Void UI的自定义突击面板", 125 | "VoidUI_assault_scale_title" : "面板比例", 126 | "VoidUI_assault_scale_desc" : "突击面板的比例", 127 | "VoidUI_badge_title" : "警察徽章", 128 | "VoidUI_badge_desc" : "在突击期间显示一个警察徽章", 129 | "VoidUI_badge_anim_title" : "徽章脉冲动画", 130 | "VoidUI_badge_anim_desc" : "用一个奇特的\"脉冲\"效果,动画警察徽章", 131 | "VoidUI_hostages_title" : "区分人质", 132 | "VoidUI_hostages_desc" : "将平民和俘虏警察展示在独立的面板中(仅强袭)", 133 | "VoidUI_pagers_title" : "显示剩余可回答对讲机", 134 | "VoidUI_pagers_desc" : "显示该劫案剩余可回答的对讲机数量(仅潜入)\n为了使此功能正常工作,你必须从一开始就扮演抢劫犯(参加整局游戏)", 135 | "VoidUI_jammer_title" : "显示干扰器时间", 136 | "VoidUI_jammer_desc" : "显示已放置ECM干扰器的剩余时间(仅潜入)\n\n[隐藏:不显示]\n[首先放置的:当多个ECM干扰器激活时,显示最旧的一个]\n[最后放置的:当多个ECM干扰器激活时,显示最新的一个]", 137 | 138 | "VoidUI_chat_clipboard" : "信息复制到剪贴板", 139 | "VoidUI_chat_title" : "玩家聊天", 140 | "VoidUI_chat_desc" : "与玩家聊天有关的选项", 141 | "VoidUI_text_chat" : "文字聊天", 142 | "VoidUI_enable_chat_title" : "启用文字聊天", 143 | "VoidUI_enable_chat_decs" : "启用Void UI的自定义文字聊天", 144 | "VoidUI_chat_scale_title" : "聊天面板比例", 145 | "VoidUI_chat_scale_desc" : "玩家聊天面板的比例", 146 | "VoidUI_chat_mouse_title" : "启用鼠标", 147 | "VoidUI_chat_mouse_desc" : "使用聊天时解锁鼠标。随着鼠标解锁,你可以更容易滚动和复制消息", 148 | "VoidUI_charactername_title" : "显示劫匪", 149 | "VoidUI_charactername_desc" : "显示玩家选用哪一个劫匪发送的消息,如括号中所示", 150 | "VoidUI_chattime_title" : "显示时间", 151 | "VoidUI_chattime_desc" : "显示发送消息的时间。\n\n[隐藏:不显示]\n[游戏时间:从当前劫案日开始计算的时间]\n[系统时间:你PC显示的系统时间]", 152 | "VoidUI_chat_copy_title" : "复制消息", 153 | "VoidUI_chat_copy_desc" : "当您右键单击它们时,聊天消息的哪部分会被复制到剪贴板", 154 | "VoidUI_voice_chat" : "语音聊天", 155 | "VoidUI_enable_voice_title" : "启用语音聊天面板", 156 | "VoidUI_enable_voice_decs" : "启用Void UI的自定义语音聊天玩家指标", 157 | "VoidUI_voice_scale_title" : "指标大小", 158 | "VoidUI_voice_scale_desc" : "交流者指标的规模", 159 | "VoidUI_voice_name_title" : "显示名字", 160 | "VoidUI_voice_name_desc" : "显示交流者的名字", 161 | 162 | "VoidUI_label_title" : "标签和导航点", 163 | "VoidUI_label_desc" : "与浮动标签和导航点相关的选项", 164 | "VoidUI_label" : "名字标签", 165 | "VoidUI_enable_labels_title" : "启用名字标签", 166 | "VoidUI_enable_labels_desc" : "启用Void UI的自定义名字标签", 167 | "VoidUI_jokernames_title" : "变节敌人标签", 168 | "VoidUI_jokernames_desc" : "为变节敌人添加名字标签", 169 | "VoidUI_jokerhealth_title" : "变节敌人生命值", 170 | "VoidUI_jokerhealth_desc" : "在变节敌人的名字标签上显示他们的健康状况", 171 | "VoidUI_label_scale_title" : "名字标签比例", 172 | "VoidUI_label_scale_desc" : "名字标签的比例", 173 | "VoidUI_label_upper_title" : "大写名字", 174 | "VoidUI_label_upper_desc" : "以全部大写形式显示名字", 175 | "VoidUI_minlabel_title" : "迷你标签模式", 176 | "VoidUI_minlabel_desc" : "当它们(指的是名字标签)的主人远离你或者你不看它们时,名字标签会变小", 177 | "VoidUI_label_minscale_title" : "名字标签迷你模式比例", 178 | "VoidUI_label_minscale_desc" : "迷你模式下名字标签的比例", 179 | "VoidUI_minrank_title" : "在迷你模式中显示转生次数和等级", 180 | "VoidUI_minrank_desc" : "当他们的标签处于迷你模式时,显示队友的转生次数和等级", 181 | "VoidUI_mindist_title" : "迷你模式距离", 182 | "VoidUI_mindist_desc" : "名字标签应距离你多远才会进入迷你模式(以米为单位)", 183 | "VoidUI_mindot_title" : "禁用迷你模式区域比例", 184 | "VoidUI_mindot_desc" : "设置你将准星指向一位玩家时,暂时禁用该玩家名字标签迷你模式的区域比例", 185 | "VoidUI_waypoints" : "导航点", 186 | "VoidUI_enable_waypoints_title" : "启用导航点", 187 | "VoidUI_enable_waypoints_desc" : "启用Void UI导航点", 188 | "VoidUI_waypoint_scale_title" : "导航点比例", 189 | "VoidUI_waypoint_scale_desc" : "目标导航点和侦测标记点(举例:潜入时你正被保安侦测)的比例", 190 | "VoidUI_waypoint_radius_title" : "屏幕外导航点偏移", 191 | "VoidUI_waypoint_radius_desc" : "当它们的来源不在视野中时,导航点距离屏幕中心应会有多远的距离", 192 | "VoidUI_waypoint_offscreen_title" : "显示屏幕外导航点", 193 | "VoidUI_waypoint_offscreen_desc" : "当他们的来源不在视野中时显示导航点", 194 | 195 | "VoidUI_interact_title" : "互动和侦测", 196 | "VoidUI_interact_desc" : "与互动和潜入侦测面板相关的选项", 197 | "VoidUI_interact" : "互动面板", 198 | "VoidUI_enable_interact_title" : "启用互动面板", 199 | "VoidUI_enable_interact_desc" : "启用Void UI的自定义互动面板", 200 | "VoidUI_interact_scale_title" : "互动面板比例", 201 | "VoidUI_interact_scale_desc" : "互动面板的比例", 202 | "VoidUI_interact_y_title" : "互动面板Y位置", 203 | "VoidUI_interact_y_desc" : "互动面板在屏幕中的垂直位置", 204 | "VoidUI_interacttime_title" : "互动时间", 205 | "VoidUI_interacttime_desc" : "显示你互动时的剩余时间", 206 | "VoidUI_suspicion" : "侦测面板", 207 | "VoidUI_enable_suspicion_title" : "启用侦测面板", 208 | "VoidUI_enable_suspicion_desc" : "启用Void UI的自定义潜入侦测面板", 209 | "VoidUI_suspicion_y_title" : "侦测面板Y位置", 210 | "VoidUI_suspicion_y_desc" : "侦测面板在屏幕中的垂直位置", 211 | "VoidUI_suspicion_scale_title" : "侦测比例", 212 | "VoidUI_suspicion_scale_desc" : "侦测面板的比例", 213 | 214 | "VoidUI_stats_title" : "统计屏幕", 215 | "VoidUI_stats_desc" : "与TAB统计屏幕相关的选项", 216 | "VoidUI_enable_stats_title" : "启用统计屏幕", 217 | "VoidUI_enable_stats_desc" : "启用Void UI的自定义统计屏幕", 218 | "VoidUI_scoreboard_scale_title" : "统计屏幕面板比例", 219 | "VoidUI_scoreboard_scale_desc" : "统计屏幕面板的比例", 220 | "VoidUI_blur_title" : "模糊背景", 221 | "VoidUI_blur_desc" : "统计屏幕面板打开时模糊背景", 222 | "VoidUI_scoreboard_maxlevel_title" : "显示满级经验条", 223 | "VoidUI_scoreboard_maxlevel_desc" : "当你等级100时仍然显示经验条", 224 | "VoidUI_scoreboard" : "记分板", 225 | "VoidUI_scoreboard_title" : "启用记分板", 226 | "VoidUI_scoreboard_desc" : "在统计屏幕上添加一个记分板,你可以看到你和你队友的统计数据", 227 | "VoidUI_scoreboard_accuracy_title" : "显示精准度", 228 | "VoidUI_scoreboard_accuracy_desc" : "在劫案当天显示你的命中精准度", 229 | "VoidUI_scoreboard_delay_title" : "显示交易延迟", 230 | "VoidUI_scoreboard_delay_desc" : "如果你被拘留,显示你需要等待多久才能被人质所交易", 231 | "VoidUI_scoreboard_character_title" : "显示劫匪", 232 | "VoidUI_scoreboard_character_desc" : "显示玩家正在玩的劫匪(角色)面具", 233 | "VoidUI_scoreboard_skills_title" : "显示技能", 234 | "VoidUI_scoreboard_skills_desc" : "显示玩家在每个技能树中花费的技能点数", 235 | "VoidUI_scoreboard_kills_title" : "显示击杀数", 236 | "VoidUI_scoreboard_kills_desc" : "显示玩家击杀执法人员的数量\n\n[禁用:不显示]\n[排除特殊敌人:不要将击杀的特殊敌人计为正常击杀]\n[包括特殊敌人:将击杀的特殊敌人计为正常击杀]", 237 | "VoidUI_scoreboard_specials_title" : "显示特殊敌人击杀", 238 | "VoidUI_scoreboard_specials_desc" : "显示玩家击杀特殊敌人的数量", 239 | "VoidUI_scoreboard_civs_title" : "显示平民击杀", 240 | "VoidUI_scoreboard_civs_desc" : "显示玩家击杀平民的数量", 241 | "VoidUI_scoreboard_downs_title" : "显示倒地次数", 242 | "VoidUI_scoreboard_downs_desc" : "显示玩家被击倒的次数", 243 | "VoidUI_scoreboard_downs_no_reset_title" : "显示总倒地次数", 244 | "VoidUI_scoreboard_downs_no_reset_desc" : "显示每个劫案的总倒地次数", 245 | "VoidUI_scoreboard_weapons_title" : "显示武器/BOT的面具", 246 | "VoidUI_scoreboard_weapons_desc" : "显示玩家的主要武器、次要武器(或BOT面具)和近战武器", 247 | "VoidUI_scoreboard_armor_title" : "显示护甲", 248 | "VoidUI_scoreboard_armor_desc" : "显示玩家装备的护甲", 249 | "VoidUI_scoreboard_skins_title" : "显示武器皮肤", 250 | "VoidUI_scoreboard_skins_desc" : "显示玩家使用的武器中已装备的皮肤\n\n[禁用:不显示武器皮肤]\n[显示稀有度:显示武器背后的皮肤稀有背景]\n[不显示稀有度:不显示武器背后的皮肤稀有背景]", 251 | "VoidUI_scoreboard_perk_title" : "显示天赋/AI团队技能", 252 | "VoidUI_scoreboard_perk_desc" : "显示玩家的配备的天赋及其天赋等级(AI则显示为团队技能)", 253 | "VoidUI_scoreboard_playtime_title" : "显示游戏时间/AI团队加成", 254 | "VoidUI_scoreboard_playtime_desc" : "如果玩家的个人资料和游戏时间是公开的,则显示玩家在收获日游玩的时间(AI则显示为团队加成)", 255 | "VoidUI_scoreboard_ping_title" : "显示延迟/PING", 256 | "VoidUI_scoreboard_ping_desc" : "向你展示其他玩家的延迟", 257 | "VoidUI_ping_frequency_title" : "延迟更新频率", 258 | "VoidUI_ping_frequency_desc" : "PING值更新的频率(以秒为单位)", 259 | "VoidUI_scoreboard_toggle_title" : "切换按钮", 260 | "VoidUI_scoreboard_toggle_desc" : "设置在记分板和追踪成绩之间切换的按钮", 261 | "VoidUI_error" : "Steam出错", 262 | "VoidUI_private" : "隐藏资料", 263 | "VoidUI_hidden" : "游戏时间被隐藏", 264 | "VoidUI_player" : "玩家", 265 | "VoidUI_kills" : "击杀", 266 | "VoidUI_specials" : "特殊", 267 | "VoidUI_civs" : "平民", 268 | "VoidUI_downs" : "倒地", 269 | "VoidUI_perk" : "天赋", 270 | "VoidUI_playtime" : "游戏时间", 271 | "VoidUI_ping" : "延迟", 272 | "VoidUI_nosong" : "无", 273 | 274 | "VoidUI_presenter_title" : "通知", 275 | "VoidUI_presenter_desc" : "与HUD通知相关的选项", 276 | "VoidUI_enable_presenter_title" : "启用主演者通知", 277 | "VoidUI_enable_presenter_desc" : "启用Void UI的自定义主演者通知", 278 | "VoidUI_presenter_scale_title" : "通知面板比例", 279 | "VoidUI_presenter_scale_desc" : "主演者通知面板的比例", 280 | "VoidUI_presenter_buffer_title" : "最大主演者通知数", 281 | "VoidUI_presenter_buffer_desc" : "可同时显示的最大通知量", 282 | "VoidUI_presenter_sound_title" : "播放通知静音", 283 | "VoidUI_presenter_sound_desc" : "出现特定通知时禁止播放音效", 284 | "VoidUI_presenter_panel" : "主演者通知", 285 | "VoidUI_hint_panel" : "提示通知", 286 | "VoidUI_enable_hint_title" : "启用提示面板", 287 | "VoidUI_enable_hint_desc" : "启用Void UI的自定义提示面板", 288 | "VoidUI_hint_scale_title" : "文本比例", 289 | "VoidUI_hint_scale_desc" : "提示文本的比例", 290 | "VoidUI_hint_anim_title" : "提示动画", 291 | "VoidUI_hint_anim_desc" : "提示动画会有一个奇特的\"跳出\"效果", 292 | "VoidUI_hint_color_title" : "颜色提示", 293 | "VoidUI_hint_color_desc" : "使用色彩显示队友的名字", 294 | "VoidUI_vape_hints_title" : "标记团队提示", 295 | "VoidUI_vape_hints_desc" : "使用双人搭档并在标记某人/被标记时显示提示,并且会短时间显示标记轮廓", 296 | "VoidUI_challanges_panel" : "挑战通知", 297 | "VoidUI_enable_challanges_title" : "启用挑战通知", 298 | "VoidUI_enable_challanges_desc" : "启用Void UI的自定义挑战通知(完成任意成就或任务时的通知)", 299 | "VoidUI_hint_challanges_desc" : "挑战通知面板的比例", 300 | 301 | "VoidUI_tag_team_owner" : "你标记了$NAME!", 302 | "VoidUI_tag_team_owner_joker" : "你标记了$NAME的变节敌人!", 303 | "VoidUI_tag_team_tagged" : "$NAME标记了你!", 304 | 305 | "VoidUI_subtitles_title" : "字幕", 306 | "VoidUI_subtitles_desc" : "与字幕相关的选项", 307 | "VoidUI_enable_subtitles_title" : "启用字幕", 308 | "VoidUI_enable_subtitles_desc" : "启用Void UI的自定义字幕", 309 | "VoidUI_subtitle_scale_title" : "字幕比例", 310 | "VoidUI_subtitle_scale_desc" : "字幕的比例", 311 | "VoidUI_subtitles_bg_title" : "背景样式", 312 | "VoidUI_subtitles_bg_desc" : "字幕的背景风格\n\n[禁用:无背景]\n[投影:给字幕添加阴影文字]\n[纯色:字幕有一个颜色框作为背景]", 313 | 314 | "VoidUI_blackscreen_title" : "劫案介绍和加载屏幕", 315 | "VoidUI_blackscreen_desc" : "与劫案介绍和加载屏幕有关的选项", 316 | "VoidUI_blackscreen" : "劫案介绍", 317 | "VoidUI_enable_blackscreen_title" : "启用劫案介绍", 318 | "VoidUI_enable_blackscreen_desc" : "启用Void UI的自定义劫案简介(黑屏)", 319 | "VoidUI_blackscreen_map_title" : "显示当天", 320 | "VoidUI_blackscreen_map_desc" : "显示当天的劫案名称", 321 | "VoidUI_blackscreen_risk_title" : "显示难度名称", 322 | "VoidUI_blackscreen_risk_desc" : "显示你正在玩的难度名称", 323 | "VoidUI_blackscreen_skull_title" : "显示难度图标", 324 | "VoidUI_blackscreen_skull_desc" : "显示你正在玩的难度图标", 325 | "VoidUI_blackscreen_linger_title" : "劫案介绍淡出", 326 | "VoidUI_blackscreen_linger_desc" : "劫案介绍的文字将会游戏开始的一段时间后淡出", 327 | "VoidUI_blackscreen_time_title" : "跳过介绍时间", 328 | "VoidUI_blackscreen_time_desc" : "你需要按住Enter键多长时间才能跳过劫案简介", 329 | "VoidUI_skip_blackscreen" : "按下$BTN_ACCEPT跳过", 330 | "VoidUI_loading_others" : "还有其他$PLAYERS名玩家", 331 | "VoidUI_loading" : "加载屏幕", 332 | "VoidUI_enable_loadingscreen_title" : "启用加载屏幕", 333 | "VoidUI_enable_loadingscreen_desc" : "启用Void UI的自定义加载屏幕", 334 | "VoidUI_loading_heistinfo_title" : "劫案信息", 335 | "VoidUI_loading_heistinfo_desc" : "显示劫案信息,如劫案名称、联系人以及选择的难度", 336 | "VoidUI_loading_players_title" : "连接玩家", 337 | "VoidUI_loading_players_desc" : "显示你连接玩家的名字", 338 | "VoidUI_loading_briefing_title" : "任务简报", 339 | "VoidUI_loading_briefing_desc" : "显示联系人的任务简报", 340 | 341 | "VoidUI_joining_title" : "玩家加入", 342 | "VoidUI_joining_desc" : "与玩家加入时插入式客户端面板相关的选项", 343 | "VoidUI_enable_joining_title" : "启用玩家加入面板", 344 | "VoidUI_enable_joining_desc" : "启用Void UI的自定义加入时插入式客户端面板", 345 | "VoidUI_joining_rank_desc" : "显示加入玩家的游戏等级和恶名等级", 346 | "VoidUI_joining_time_title" : "显示剩余时间", 347 | "VoidUI_joining_time_desc" : "显示玩家加入的预计时间", 348 | "VoidUI_joining_border_title" : "彩色加入面板", 349 | "VoidUI_joining_border_desc" : "整个面板颜色将使用玩家加入时所会使用的颜色", 350 | "VoidUI_joining_anim_title" : "面板动画", 351 | "VoidUI_joining_anim_desc" : "面板的动画风格\n\n[静态:不要动画]\n[旋转:面板缓慢向左或向右旋转]\n[脉冲:面板正在缓慢变大或缩小]\n[旋转和脉冲:面板同时旋转和脉冲]", 352 | "VoidUI_joining_mods_title" : "显示已安装Mods", 353 | "VoidUI_joining_mods_desc" : "显示加入玩家安装的Mods", 354 | "VoidUI_joining_mods_scale_title" : "Mods面板比例", 355 | "VoidUI_joining_mods_scale_desc" : "\"已安装Mods\"面板的比例", 356 | "VoidUI_joining_drawing_title" : "启用绘图", 357 | "VoidUI_joining_drawing_desc" : "通过按住Ctrl + 鼠标左键,可以在连接屏幕上绘制图形", 358 | 359 | "VoidUI_disabled" : "隐藏", 360 | "VoidUI_ecm_first" : "首先放置的", 361 | "VoidUI_ecm_last" : "最后放置的", 362 | "VoidUI_health_percentage" : "百分比", 363 | "VoidUI_health_real" : "实际数值", 364 | "VoidUI_gametime" : "游戏时间", 365 | "VoidUI_realtime" : "系统时间", 366 | "VoidUI_disable" : "禁用", 367 | "VoidUI_chat_message" : "仅玩家消息", 368 | "VoidUI_chat_name" : "玩家:消息", 369 | "VoidUI_chat_character" : "劫匪:消息", 370 | "VoidUI_chat_name_character" : "玩家(劫匪):消息", 371 | "VoidUI_assault_lines_30sec" : "标准", 372 | "VoidUI_assault_lines_every10sec" : "简单", 373 | "VoidUI_nonspecial" : "排除特殊敌人", 374 | "VoidUI_withspecial" : "包括特殊敌人", 375 | "VoidUI_rarity" : "显示稀有度", 376 | "VoidUI_norarity" : "不显示稀有度", 377 | "VoidUI_on_scoreboard" :"在统计屏幕中", 378 | "VoidUI_show" : "显示", 379 | "VoidUI_subtitles_shadow" : "投影", 380 | "VoidUI_subtitles_fill" : "纯色", 381 | "VoidUI_jump" : "跳跃键", 382 | "VoidUI_crouch" : "蹲伏键", 383 | "VoidUI_rmb" : "鼠标右键", 384 | "VoidUI_joining_anim_off" : "静态", 385 | "VoidUI_joining_anim_rot" : "旋转", 386 | "VoidUI_joining_anim_grow" : "脉冲", 387 | "VoidUI_joining_anim_full" : "旋转和脉冲", 388 | "VoidUI_red" : "红色", 389 | "VoidUI_green" : "绿色", 390 | "VoidUI_blue" : "蓝色", 391 | "VoidUI_not_ai" : "仅玩家", 392 | 393 | "VoidUI_fire_volley" : "抽射" 394 | 395 | } 396 | -------------------------------------------------------------------------------- /lua/hud/HudBlackscreen.lua: -------------------------------------------------------------------------------- 1 | if VoidUI.options.enable_blackscreen then 2 | if RequiredScript == "lib/managers/hud/hudblackscreen" then 3 | function HUDBlackScreen:init(hud) 4 | self._hud_panel = hud.panel 5 | if self._hud_panel:child("blackscreen_panel") then 6 | self._hud_panel:remove(self._hud_panel:child("blackscreen_panel")) 7 | end 8 | self._blackscreen_panel = self._hud_panel:panel({ 9 | visible = false, 10 | name = "blackscreen_panel", 11 | y = 0, 12 | valign = "grow", 13 | halign = "grow", 14 | layer = 10 15 | }) 16 | local mid_text = self._blackscreen_panel:text({ 17 | name = "mid_text", 18 | visible = true, 19 | text = "000", 20 | layer = 1, 21 | color = Color.white, 22 | y = 0, 23 | valign = {0.4, 0}, 24 | align = "center", 25 | vertical = "center", 26 | font_size = tweak_data.hud.default_font_size * 2, 27 | font = tweak_data.hud.medium_font, 28 | w = self._blackscreen_panel:w() 29 | }) 30 | local _, _, _, h = mid_text:text_rect() 31 | mid_text:set_h(h) 32 | mid_text:set_center_x(self._blackscreen_panel:center_x()) 33 | mid_text:set_center_y(self._blackscreen_panel:h() / 2.5) 34 | local is_server = Network:is_server() 35 | local continue_button = managers.menu:is_pc_controller() and "ENTER" or managers.localization:get_default_macro("BTN_A") 36 | local text = managers.localization:to_upper_text(VoidUI.options.blackscreen_time > 0 and "hud_skip_blackscreen" or "VoidUI_skip_blackscreen", {BTN_ACCEPT = continue_button}) 37 | local skip_text = self._blackscreen_panel:text({ 38 | name = "skip_text", 39 | visible = is_server, 40 | text = text, 41 | layer = 1, 42 | color = Color.white, 43 | y = 0, 44 | align = "center", 45 | vertical = "bottom", 46 | font_size = nil, 47 | font = tweak_data.hud.medium_font_noshadow 48 | }) 49 | managers.hud:make_fine_text(skip_text) 50 | skip_text:set_center(self._blackscreen_panel:w() / 2, self._blackscreen_panel:h() / 1.5) 51 | self._skip_bar = self._blackscreen_panel:bitmap({ 52 | layer = 2, 53 | w = 0, 54 | y = 15, 55 | h = 2, 56 | visible = VoidUI.options.blackscreen_time > 0 57 | }) 58 | self._skip_bar:set_lefttop(skip_text:x(), skip_text:bottom()) 59 | local loading_text = managers.localization:text("menu_loading_progress", {prog = 0}) 60 | local loading_text_object = self._blackscreen_panel:text({ 61 | name = "loading_text", 62 | visible = false, 63 | text = loading_text, 64 | layer = 1, 65 | color = Color.white, 66 | y = 0, 67 | align = "center", 68 | vertical = "bottom", 69 | font_size = nil, 70 | font = tweak_data.hud.medium_font_noshadow 71 | }) 72 | 73 | loading_text_object:set_h(select(4,loading_text_object:text_rect())) 74 | end 75 | 76 | function HUDBlackScreen:_set_job_data() 77 | if not managers.job:has_active_job() or self._blackscreen_panel:child("custom_job_panel") then 78 | return 79 | end 80 | local job_panel = self._blackscreen_panel:panel({ 81 | visible = true, 82 | name = "custom_job_panel", 83 | y = 0, 84 | valign = "grow", 85 | halign = "grow", 86 | layer = 1 87 | }) 88 | local skip_text = self._blackscreen_panel:child("skip_text") 89 | local loading_text = self._blackscreen_panel:child("loading_text") 90 | local risk_panel = job_panel:panel({name = "risk_panel"}) 91 | local last_risk_level 92 | local blackscreen_risk_textures = tweak_data.gui.blackscreen_risk_textures 93 | local current_dif = managers.job:current_difficulty_stars() 94 | local difficulty_color = tweak_data.screen_colors.risk 95 | if Global.game_settings.one_down then difficulty_color = tweak_data.screen_colors.one_down end 96 | local risk_text = risk_panel:text({ 97 | name = "risk_text", 98 | text = VoidUI.options.blackscreen_risk and managers.localization:to_upper_text(tweak_data.difficulty_name_id) or "", 99 | font = tweak_data.menu.pd2_large_font, 100 | font_size = 35, 101 | align = "right", 102 | vertical = "center", 103 | color = difficulty_color, 104 | y = 2, 105 | h = 35 106 | }) 107 | managers.hud:make_fine_text(risk_text) 108 | for i = 1, #tweak_data.difficulties - 2 do 109 | local difficulty_name = tweak_data.difficulties[i + 2] 110 | local texture = blackscreen_risk_textures[difficulty_name] or "guis/textures/pd2/risklevel_blackscreen" 111 | last_risk_level = risk_panel:bitmap({ 112 | name = "star_"..i, 113 | texture = texture, 114 | color = tweak_data.screen_colors.risk, 115 | w = VoidUI.options.blackscreen_skull and 35 or 0, 116 | h = 35 117 | }) 118 | last_risk_level:set_color(i <= current_dif and difficulty_color or tweak_data.screen_colors.text) 119 | last_risk_level:set_alpha(i <= current_dif and 1 or 0.20) 120 | last_risk_level:move(risk_text:w() + (i - 1) * last_risk_level:w(), 0) 121 | end 122 | if last_risk_level then 123 | risk_panel:set_size(last_risk_level:right(), last_risk_level:bottom()) 124 | risk_panel:set_center(job_panel:w() / 2, job_panel:h() / 2) 125 | risk_panel:set_position(math.round(risk_panel:x()), math.round(risk_panel:y())) 126 | end 127 | skip_text:set_top(risk_panel:bottom() + skip_text:h()) 128 | skip_text:set_center_x(job_panel:w() / 2) 129 | self._skip_bar:set_position(skip_text:x(), skip_text:bottom()) 130 | loading_text:set_top(risk_panel:bottom() + loading_text:h()) 131 | loading_text:set_center_x(job_panel:w() / 2) 132 | 133 | if _G.DW and blackscreen_risk_textures and current_dif > 4 then 134 | local stars_image = current_dif == 6 and blackscreen_risk_textures.sm_wish or blackscreen_risk_textures.overkill_290 135 | for i=1, current_dif-1 do 136 | risk_panel:child("star_"..i):set_image(stars_image) 137 | end 138 | risk_panel:child("star_"..current_dif):set_image(blackscreen_risk_textures.deathwishplus) 139 | end 140 | 141 | local level_data = managers.job:current_level_data() 142 | local job_data = managers.job:current_job_data() 143 | if level_data then 144 | local level_text = job_panel:text({ 145 | name = "level_text", 146 | text = VoidUI.options.blackscreen_map and managers.localization:to_upper_text(level_data.name_id == "heist_branchbank_hl" and job_data.name_id or level_data.name_id) or "", 147 | font = tweak_data.menu.pd2_large_font, 148 | font_size = 50, 149 | align = "center", 150 | vertical = "bottom", 151 | color = tweak_data.screen_colors.risk, 152 | }) 153 | if managers.skirmish:is_skirmish() then 154 | level_text:set_text(managers.localization:to_upper_text(managers.skirmish:is_weekly_skirmish() and "hud_weekly_skirmish" or "hud_skirmish")..": "..level_text:text()) 155 | end 156 | level_text:set_bottom(risk_panel:top()) 157 | level_text:set_center_x(risk_panel:center_x()) 158 | end 159 | job_panel:animate(callback(self, self, "_animate_grow")) 160 | end 161 | 162 | function HUDBlackScreen:_animate_grow(job_panel) 163 | local level_text = job_panel:child("level_text") 164 | local t = 0 165 | local TOTAL_T = 120 166 | while TOTAL_T > t do 167 | local dt = coroutine.yield() 168 | t = t + dt 169 | level_text:set_font_size(math.lerp(50, 120, t / TOTAL_T)) 170 | end 171 | end 172 | 173 | function HUDBlackScreen:_set_job_data_crime_spree() 174 | if self._blackscreen_panel:child("custom_job_panel") then 175 | return 176 | end 177 | local skip_text = self._blackscreen_panel:child("skip_text") 178 | local loading_text = self._blackscreen_panel:child("loading_text") 179 | local job_panel = self._blackscreen_panel:panel({ 180 | visible = true, 181 | name = "custom_job_panel", 182 | y = 0, 183 | valign = "grow", 184 | halign = "grow", 185 | layer = 1 186 | }) 187 | local risk_panel = job_panel:panel({name = "risk_panel"}) 188 | local job_text = risk_panel:text({ 189 | text = VoidUI.options.blackscreen_risk and managers.localization:to_upper_text("cn_crime_spree") or "", 190 | font = tweak_data.menu.pd2_large_font, 191 | font_size = 35, 192 | align = "center", 193 | vertical = "bottom", 194 | color = tweak_data.screen_colors.crime_spree_risk 195 | }) 196 | managers.hud:make_fine_text(job_text) 197 | local risk_text = risk_panel:text({ 198 | text = VoidUI.options.blackscreen_skull and managers.localization:to_upper_text("menu_cs_level", { 199 | level = managers.experience:cash_string(managers.crime_spree:server_spree_level(), "") 200 | }) or "", 201 | font = tweak_data.menu.pd2_large_font, 202 | font_size = 35, 203 | align = "center", 204 | vertical = "top", 205 | color = tweak_data.screen_colors.crime_spree_risk 206 | }) 207 | managers.hud:make_fine_text(risk_text) 208 | risk_text:set_left(job_text:right() + 10) 209 | risk_panel:set_size(risk_text:right(), risk_text:bottom()) 210 | risk_panel:set_center(job_panel:w() / 2, job_panel:h() / 2) 211 | risk_panel:set_position(math.round(risk_panel:x()), math.round(risk_panel:y())) 212 | 213 | skip_text:set_top(risk_panel:bottom() + skip_text:h()) 214 | skip_text:set_center_x(job_panel:w() / 2) 215 | self._skip_bar:set_position(skip_text:x(), skip_text:bottom()) 216 | loading_text:set_top(risk_panel:bottom() + loading_text:h()) 217 | loading_text:set_center_x(job_panel:w() / 2) 218 | 219 | local level_data = managers.job:current_level_data() 220 | local job_data = managers.job:current_job_data() 221 | if level_data then 222 | local level_text = job_panel:text({ 223 | name = "level_text", 224 | text = VoidUI.options.blackscreen_map and managers.localization:to_upper_text(level_data.name_id) or "", 225 | font = tweak_data.menu.pd2_large_font, 226 | font_size = 50, 227 | align = "center", 228 | vertical = "bottom", 229 | color = tweak_data.screen_colors.crime_spree_risk, 230 | }) 231 | level_text:set_bottom(risk_panel:top()) 232 | level_text:set_center_x(risk_panel:center_x()) 233 | end 234 | job_panel:animate(callback(self, self, "_animate_grow")) 235 | end 236 | 237 | local fade_in_mid_text = HUDBlackScreen.fade_in_mid_text 238 | function HUDBlackScreen:fade_in_mid_text() 239 | self._blackscreen_panel:set_visible(true) 240 | fade_in_mid_text(self) 241 | end 242 | 243 | local fade_out_mid_text = HUDBlackScreen.fade_out_mid_text 244 | function HUDBlackScreen:fade_out_mid_text() 245 | self._blackscreen_panel:child("mid_text"):stop() 246 | fade_out_mid_text(self) 247 | self._blackscreen_panel:child("skip_text"):set_visible(false) 248 | end 249 | 250 | local animate_fade_out = HUDBlackScreen._animate_fade_out 251 | function HUDBlackScreen:_animate_fade_out(mid_text) 252 | if VoidUI.options.blackscreen_linger then 253 | local job_panel = self._blackscreen_panel:child("job_panel") 254 | local hud_panel = managers.hud:script(PlayerBase.PLAYER_INFO_HUD_PD2).panel 255 | if VoidUI.options.teammate_panels then 256 | hud_panel:set_alpha(0) 257 | end 258 | local t = 0.7 259 | local d = t 260 | wait(1.6) 261 | while t > 0 do 262 | local dt = coroutine.yield() 263 | t = t - dt 264 | self._blackscreen_panel:set_alpha(math.min(t / (d - 0.2), 1)) 265 | if VoidUI.options.teammate_panels then 266 | hud_panel:set_alpha(math.min(1 - (t - 0.3) / (d - 0.3), 1)) 267 | end 268 | end 269 | self._blackscreen_panel:set_alpha(0) 270 | hud_panel:set_alpha(1) 271 | managers.hud:hide(Idstring("guis/level_intro")) 272 | else 273 | animate_fade_out(self, mid_text) 274 | end 275 | self._blackscreen_panel:child("custom_job_panel"):stop() 276 | end 277 | 278 | function HUDBlackScreen:set_skip_circle(current, total) 279 | self._skip_bar:set_w(current / total * self._blackscreen_panel:child("skip_text"):w()) 280 | end 281 | 282 | function HUDBlackScreen:skip_circle_done() 283 | self._blackscreen_panel:child("skip_text"):animate(callback(self, self, "_animate_skip_complete"), self._skip_bar) 284 | end 285 | 286 | function HUDBlackScreen:_animate_skip_complete(skip_text, skip_bar) 287 | local center_x = skip_text:center_x() 288 | local w = skip_text:w() 289 | local t = 0 290 | local TOTAL_T = 0.3 291 | while t < TOTAL_T do 292 | local dt = coroutine.yield() 293 | t = t + dt 294 | skip_text:set_w(math.lerp(w, 0, t / TOTAL_T)) 295 | skip_bar:set_w(skip_text:w()) 296 | skip_text:set_center_x(center_x) 297 | skip_bar:set_center_x(center_x) 298 | end 299 | skip_text:set_w(0) 300 | skip_bar:set_w(0) 301 | end 302 | 303 | elseif RequiredScript == "lib/states/ingamewaitingforplayers" then 304 | local update = IngameWaitingForPlayersState.update 305 | function IngameWaitingForPlayersState:update(t, dt) 306 | if self._skip_data then 307 | self._skip_data.total = VoidUI.options.blackscreen_time 308 | end 309 | return update(self, t, dt) 310 | end 311 | if VoidUI.options.blackscreen_linger then 312 | local at_exit = IngameWaitingForPlayersState.at_exit 313 | function IngameWaitingForPlayersState:at_exit(next_state) 314 | at_exit(self, next_state) 315 | managers.hud:show(Idstring("guis/level_intro")) 316 | managers.hud:blackscreen_fade_out_mid_text() 317 | end 318 | end 319 | elseif RequiredScript == "lib/managers/menu/fadeoutguiobject" then 320 | function FadeoutGuiObject:init(params) 321 | Global.FadeoutObjects = Global.FadeoutObjects or {} 322 | 323 | table.insert(Global.FadeoutObjects, self) 324 | 325 | params = params or {} 326 | self._fade_out_duration = params.fade_out or 0 327 | self._fade_out_duration = params.sustain or nil 328 | local show_loding_icon = params.show_loading_icon or true 329 | local loading_texture = "guis/textures/VoidUI/hud_extras" 330 | self._ws = managers.gui_data:create_saferect_workspace() 331 | self._panel = self._ws:panel({alpha = 0}) 332 | self._panel:set_layer(1000) 333 | 334 | if show_loding_icon then 335 | local loading_icon = self._panel:bitmap({ 336 | name = "loading_icon", 337 | texture = loading_texture, 338 | texture_rect = {1085, 174, 55, 54}, 339 | alpha = 0 340 | }) 341 | loading_icon:set_rightbottom(self._panel:w(), self._panel:h()) 342 | 343 | local loading_logo = self._panel:bitmap({ 344 | name = "loading_logo", 345 | texture = loading_texture, 346 | texture_rect = {1149, 201, 37, 37} 347 | }) 348 | loading_logo:set_center(loading_icon:center()) 349 | 350 | local function spin_forever_animation(o) 351 | local dt, t = nil, 0 352 | while true do 353 | dt = coroutine.yield() 354 | t = t + dt 355 | o:set_alpha(math.abs(math.sin(120 * t))) 356 | end 357 | end 358 | local function fade_in_animation(panel) 359 | over(0.2, function (p) 360 | panel:set_alpha(p) 361 | end) 362 | loading_icon:animate(spin_forever_animation) 363 | end 364 | self._panel:animate(fade_in_animation) 365 | end 366 | 367 | local function fade_out_animation(panel) 368 | while not self._fade_out_duration do 369 | wait(1) 370 | end 371 | 372 | over(self._fade_out_duration / 1.5, function (p) 373 | panel:set_alpha(1 - p) 374 | end) 375 | managers.gui_data:destroy_workspace(self._ws) 376 | table.delete(Global.FadeoutObjects, self) 377 | end 378 | self._panel:animate(fade_out_animation) 379 | end 380 | end 381 | end -------------------------------------------------------------------------------- /lua/hud/HudDowns.lua: -------------------------------------------------------------------------------- 1 | if RequiredScript == "lib/units/beings/player/huskplayermovement" then 2 | 3 | local start_bleedout = HuskPlayerMovement._perform_movement_action_enter_bleedout 4 | 5 | function HuskPlayerMovement:_perform_movement_action_enter_bleedout(...) 6 | local data = managers.criminals:character_data_by_unit(self._unit) 7 | if data and data.panel_id then 8 | managers.hud:player_downed(data.panel_id) 9 | end 10 | 11 | return start_bleedout(self, ...) 12 | end 13 | 14 | elseif RequiredScript == "lib/units/beings/player/states/playerbleedout" then 15 | local start_bleedout = PlayerBleedOut._enter 16 | 17 | function PlayerBleedOut:_enter(...) 18 | managers.hud:player_downed(HUDManager.PLAYER_PANEL) 19 | return start_bleedout(self, ...) 20 | end 21 | 22 | elseif RequiredScript == "lib/network/handlers/unitnetworkhandler" then 23 | 24 | local doctor_bag_taken = UnitNetworkHandler.sync_doctor_bag_taken 25 | 26 | function UnitNetworkHandler:sync_doctor_bag_taken(unit, amount, sender, ...) 27 | local peer = self._verify_sender(sender) 28 | if peer then 29 | local data = managers.criminals:character_data_by_peer_id(peer:id()) 30 | if data and data.panel_id then 31 | managers.hud:player_reset_downs(data.panel_id) 32 | end 33 | end 34 | 35 | return doctor_bag_taken(self, unit, amount, sender, ...) 36 | end 37 | 38 | local teammate_interact = UnitNetworkHandler.sync_teammate_progress 39 | function UnitNetworkHandler:sync_teammate_progress(type_index, enabled, tweak_data_id, timer, success, sender) 40 | if tweak_data_id == "corpse_alarm_pager" and success == true then managers.hud:pager_used() end 41 | return teammate_interact(self, type_index, enabled, tweak_data_id, timer, success, sender) 42 | end 43 | 44 | elseif RequiredScript == "lib/units/equipment/doctor_bag/doctorbagbase" then 45 | 46 | local doctor_bag_taken = DoctorBagBase.take 47 | 48 | function DoctorBagBase:take(...) 49 | managers.hud:player_reset_downs(HUDManager.PLAYER_PANEL) 50 | 51 | return doctor_bag_taken(self, ...) 52 | end 53 | 54 | end -------------------------------------------------------------------------------- /lua/hud/HudHeistTimer.lua: -------------------------------------------------------------------------------- 1 | if VoidUI.options.enable_timer then 2 | function HUDHeistTimer:init(hud, tweak_hud) 3 | self._hud_panel = hud.panel 4 | if self._hud_panel:child("heist_timer_panel") then 5 | self._hud_panel:remove(self._hud_panel:child("heist_timer_panel")) 6 | end 7 | self._scale = VoidUI.options.hud_objectives_scale 8 | local visible = VoidUI.options.show_timer 9 | 10 | self._heist_timer_panel = self._hud_panel:panel({ 11 | visible = visible == 3, 12 | alpha = visible and 1 or 0, 13 | name = "heist_timer_panel", 14 | h = 150 * self._scale, 15 | y = 0, 16 | valign = "top", 17 | layer = 0 18 | }) 19 | self._timer_text = self._heist_timer_panel:text({ 20 | name = "timer_text", 21 | text = "00:00", 22 | font_size = tweak_data.hud.active_objective_title_font_size * self._scale, 23 | font = "fonts/font_large_mf", 24 | color = Color.white, 25 | align = "left", 26 | vertical = "center", 27 | layer = 3, 28 | wrap = false, 29 | word_wrap = false, 30 | rotation = 360, 31 | x = VoidUI.options.show_levelname and 25 * self._scale or 30 * self._scale, 32 | y = 7 * self._scale, 33 | h = 25 * self._scale 34 | }) 35 | local level_name = self._heist_timer_panel:text({ 36 | name = "level_name", 37 | visible = true, 38 | layer = 2, 39 | color = Color.white, 40 | text = " ", 41 | font_size = tweak_data.hud.active_objective_title_font_size * 1.2 * self._scale, 42 | font = "fonts/font_large_mf", 43 | x = 70 * self._scale, 44 | y = 4 * self._scale, 45 | align = "left", 46 | vertical = "top" 47 | }) 48 | local _, _, name_w, name_h = level_name:text_rect() 49 | name_w = VoidUI.options.show_levelname and name_w or 0 50 | local weapons_texture = "guis/textures/VoidUI/hud_weapons" 51 | local level_name_bg_left = self._heist_timer_panel:bitmap({ 52 | name = "level_name_bg_left", 53 | texture = weapons_texture, 54 | texture_rect = {26,0,43,150}, 55 | layer = 1, 56 | x = 9 * self._scale, 57 | w = 35 * self._scale, 58 | h = name_h + 8 * self._scale, 59 | color = Color.black, 60 | alpha = 1 61 | }) 62 | local level_name_bg = self._heist_timer_panel:bitmap({ 63 | name = "level_name_bg", 64 | texture = weapons_texture, 65 | texture_rect = {69,0,416,150}, 66 | layer = 1, 67 | w = name_w + 12 * self._scale, 68 | h = name_h + 8 * self._scale, 69 | x = 44 * self._scale, 70 | y = 0, 71 | alpha = 1 72 | }) 73 | 74 | local level_name_bg_right = self._heist_timer_panel:bitmap({ 75 | name = "level_name_bg_right", 76 | texture = weapons_texture, 77 | texture_rect = {485,0,43,150}, 78 | layer = 1, 79 | w = 35 * self._scale, 80 | h = name_h + 8 * self._scale, 81 | color = Color.black, 82 | alpha = 1 83 | }) 84 | level_name_bg_right:set_left(level_name_bg:right()) 85 | 86 | local bags_panel = self._heist_timer_panel:panel({ 87 | visible = false, 88 | name = "bags_panel", 89 | w = 70 * self._scale, 90 | h = name_h + 8 * self._scale, 91 | }) 92 | bags_panel:set_left(level_name_bg_right:right() - 5) 93 | 94 | local bags_bg_left = bags_panel:bitmap({ 95 | name = "bags_bg_left", 96 | texture = weapons_texture, 97 | texture_rect = {26,0,43,150}, 98 | layer = 1, 99 | w = bags_panel:w() / 2, 100 | h = bags_panel:h(), 101 | color = Color.black, 102 | alpha = 1 103 | }) 104 | 105 | local bags_bg_right = bags_panel:bitmap({ 106 | name = "bags_bg_right", 107 | texture = weapons_texture, 108 | texture_rect = {485,0,43,150}, 109 | layer = 1, 110 | w = bags_panel:w() / 2, 111 | h = bags_panel:h(), 112 | color = Color.black, 113 | alpha = 1 114 | }) 115 | bags_bg_right:set_left(bags_bg_left:right()) 116 | local bag_texture, bag_rect = tweak_data.hud_icons:get_icon_data("bag_icon") 117 | local bags_icon = bags_panel:bitmap({ 118 | name = "bags_icon", 119 | texture = bag_texture, 120 | texture_rect = bag_rect, 121 | alpha = 0.6, 122 | y = 8 * self._scale, 123 | w = 25 * self._scale, 124 | h = 20 * self._scale, 125 | layer = 2 126 | }) 127 | bags_icon:set_center_x(bags_bg_left:right()) 128 | 129 | local bags_count = bags_panel:text({ 130 | name = "bags_count", 131 | w = bags_panel:w() / 1.3, 132 | h = bags_panel:h(), 133 | font_size = bags_panel:h() / 1.7 * self._scale, 134 | text = managers.loot:get_secured_mandatory_bags_amount() + managers.loot:get_secured_bonus_bags_amount() * self._scale, 135 | vertical = "bottom", 136 | align = "right", 137 | font = "fonts/font_medium_noshadow_mf", 138 | layer = 3, 139 | alpha = 1, 140 | }) 141 | 142 | local level_data = managers.job:current_level_data() 143 | local job_data = managers.job:current_job_data() 144 | if level_data then 145 | level_name:set_text(VoidUI.options.show_levelname and managers.localization:text(managers.crime_spree:is_active() and level_data.name_id or (level_data.name_id == "heist_branchbank_hl" and job_data.name_id or level_data.name_id)) or " ") 146 | if managers.skirmish:is_skirmish() then 147 | level_name:set_text(managers.localization:text(managers.skirmish:is_weekly_skirmish() and "hud_weekly_skirmish" or "hud_skirmish")..": "..level_name:text()) 148 | end 149 | local _, _, name_w, name_h = level_name:text_rect() 150 | name_w = VoidUI.options.show_levelname and name_w or 0 151 | local is_level_ghostable = managers.job:is_level_ghostable(managers.job:current_level_id()) 152 | local is_whisper_mode = managers.groupai and managers.groupai:state():whisper_mode() 153 | local ghost_icon = self._heist_timer_panel:bitmap({ 154 | name = "ghost_icon", 155 | texture = "guis/textures/pd2/cn_minighost", 156 | w = 16 * self._scale, 157 | h = 16 * self._scale, 158 | layer = 2, 159 | blend_mode = "add", 160 | }) 161 | ghost_icon:set_left(71 * self._scale + name_w) 162 | ghost_icon:set_center_y(6 * self._scale + name_h / 2) 163 | ghost_icon:set_visible(is_level_ghostable and VoidUI.options.show_ghost_icon) 164 | ghost_icon:set_color(is_whisper_mode and Color.white or tweak_data.screen_colors.important_1) 165 | local ghost_w = VoidUI.options.show_ghost_icon and 15 * self._scale or 0 166 | name_w = is_level_ghostable and name_w + ghost_w or name_w 167 | level_name_bg:set_w(name_w + 12 * self._scale) 168 | level_name_bg_right:set_left(level_name_bg:right()) 169 | bags_panel:set_left(level_name_bg_right:right() - 5) 170 | if managers.groupai:state() and not self._whisper_listener then 171 | self._whisper_listener = "HUDHeistTimer_whisper_mode" 172 | managers.groupai:state():add_listener(self._whisper_listener, { 173 | "whisper_mode" 174 | }, callback(self, self, "whisper_mode_changed")) 175 | end 176 | end 177 | 178 | self._last_time = 0 179 | self._enabled = not tweak_hud.no_timer 180 | if not self._enabled then 181 | self._heist_timer_panel:hide() 182 | 183 | end 184 | 185 | end 186 | 187 | 188 | function HUDHeistTimer:whisper_mode_changed() 189 | local ghost_icon = self._heist_timer_panel:child("ghost_icon") 190 | local is_level_ghostable = managers.job:is_level_ghostable(managers.job:current_level_id()) and managers.groupai and managers.groupai:state():whisper_mode() 191 | local is_whisper_mode = managers.groupai and managers.groupai:state():whisper_mode() 192 | if alive(ghost_icon) then 193 | ghost_icon:set_color(is_whisper_mode and Color.white or tweak_data.screen_colors.important_1) 194 | end 195 | end 196 | function HUDHeistTimer:loot_value_changed() 197 | local bags_panel = self._heist_timer_panel:child("bags_panel") 198 | local bags_count = bags_panel and bags_panel:child("bags_count") 199 | if VoidUI.options.show_loot then 200 | local secured_value = managers.loot:get_secured_mandatory_bags_amount() + managers.loot:get_secured_bonus_bags_amount() 201 | if bags_panel:visible() == false and secured_value ~= 0 then 202 | bags_panel:animate(callback(self, self, "_animate_bags_enable")) 203 | bags_count:set_text("x"..secured_value) 204 | else 205 | bags_count:animate(callback(self, self, "_animate_bags_count"), secured_value) 206 | end 207 | else 208 | bags_panel:set_visible(false) 209 | end 210 | end 211 | 212 | function HUDHeistTimer:_animate_bags_enable(bags_panel) 213 | local bags_bg_left = bags_panel:child("bags_bg_left") 214 | local bags_bg_right = bags_panel:child("bags_bg_right") 215 | local bags_icon = bags_panel:child("bags_icon") 216 | local bags_count = bags_panel:child("bags_count") 217 | local x = bags_bg_left:x() 218 | local TOTAL_T = 0.2 219 | local t = 0 220 | bags_bg_left:set_x(-bags_panel:w()) 221 | bags_panel:set_visible(true) 222 | while TOTAL_T > t do 223 | local dt = coroutine.yield() 224 | t = t + dt 225 | bags_panel:set_alpha(math.lerp(0, 1, t / TOTAL_T)) 226 | bags_bg_left:set_x(math.lerp(-bags_panel:w(), x - 2, t / TOTAL_T)) 227 | bags_bg_right:set_left(bags_bg_left:right()) 228 | bags_icon:set_center_x(bags_bg_left:right()) 229 | bags_count:set_left(bags_bg_left:left()) 230 | end 231 | bags_bg_left:set_x(x) 232 | bags_bg_right:set_left(bags_bg_left:right()) 233 | bags_icon:set_center_x(bags_bg_left:right()) 234 | bags_count:set_left(bags_bg_left:left()) 235 | end 236 | 237 | function HUDHeistTimer:_animate_bags_count(bags_count, secured_value) 238 | local bags_panel = self._heist_timer_panel:child("bags_panel") 239 | local size = bags_panel:h() / 1.7 240 | local TOTAL_T = 0.2 241 | local t = 0 242 | bags_count:set_text("x"..secured_value) 243 | while TOTAL_T > t do 244 | local dt = coroutine.yield() 245 | t = t + dt 246 | bags_count:set_font_size(math.lerp(size * 1.5, size, t / TOTAL_T)) 247 | end 248 | end 249 | 250 | local timer_set_time = HUDHeistTimer.set_time 251 | function HUDHeistTimer:set_time(time) 252 | timer_set_time(self, time) 253 | self._timer_text:set_font_size(tweak_data.hud.active_objective_title_font_size * self._scale) 254 | local w = select(3, self._timer_text:text_rect()) 255 | if w > 40 * self._scale then 256 | self._timer_text:set_font_size((tweak_data.hud.active_objective_title_font_size * self._scale) * (40 * self._scale) / w) 257 | end 258 | end 259 | 260 | local modify_time = HUDHeistTimer.modify_time 261 | function HUDHeistTimer:modify_time(time) 262 | modify_time(self, time) 263 | self._timer_text:stop() 264 | self._timer_text:animate(function(o) 265 | local s = self._timer_text:font_size() 266 | over(0.3, function(p) 267 | if time ~=0 and alive(self._timer_text) then 268 | self._timer_text:set_font_size(math.lerp(s*1.5, s, p)) 269 | self._timer_text:set_color(math.lerp(time > 0 and Color.green or Color.red, Color.white, p)) 270 | end 271 | end) 272 | end) 273 | end 274 | end -------------------------------------------------------------------------------- /lua/hud/HudHint.lua: -------------------------------------------------------------------------------- 1 | if VoidUI.options.enable_hint then 2 | function HUDHint:init(hud) 3 | self._hud_panel = hud.panel 4 | if self._hud_panel:child("hint_panel") then 5 | self._hud_panel:remove(self._hud_panel:child("hint_panel")) 6 | end 7 | self._hint_panel = self._hud_panel:panel({ 8 | visible = false, 9 | name = "hint_panel", 10 | h = 30, 11 | y = 0, 12 | layer = 3 13 | }) 14 | local y = self._hud_panel:h() / 3.5 15 | self._hint_panel:set_center_y(y) 16 | local clip_panel = self._hint_panel:panel({name = "clip_panel"}) 17 | clip_panel:rect({ 18 | name = "bg", 19 | visible = true, 20 | color = Color.black:with_alpha(0) 21 | }) 22 | clip_panel:text({ 23 | name = "hint_text", 24 | text = "", 25 | font_size = 25, 26 | font = tweak_data.menu.pd2_large_font, 27 | color = Color.white, 28 | align = "center", 29 | vertical = "center", 30 | layer = 1, 31 | rotation = 360, 32 | wrap = false, 33 | word_wrap = false 34 | }) 35 | clip_panel:text({ 36 | name = "hint_text_shadow", 37 | text = "", 38 | font_size = 25, 39 | font = tweak_data.menu.pd2_large_font, 40 | x = 1, 41 | y = 1, 42 | color = Color.black, 43 | align = "center", 44 | vertical = "center", 45 | layer = 0, 46 | rotation = 360, 47 | wrap = false, 48 | word_wrap = false 49 | }) 50 | end 51 | function HUDHint:show(params) 52 | local clip_panel = self._hint_panel:child("clip_panel") 53 | self._stop = false 54 | self._hint_panel:stop() 55 | self._hint_panel:animate(callback(self, self, "_animate_show"), callback(self, self, "show_done"), params) 56 | end 57 | 58 | function HUDHint:stop() 59 | self._stop = true 60 | end 61 | 62 | function HUDHint:color_by_names(hint_text, text) 63 | if VoidUI.options.hint_color then 64 | for _, data in pairs(managers.criminals:characters()) do 65 | if data.unit and alive(data.unit) and data.unit.base and data.unit:base().nick_name and (data.peer_id or data.data.ai) then 66 | local name = string.format(" %1s", data.unit:base():nick_name()) 67 | local x = select(1, hint_text:text():find(name.." ", 1, true)) or select(1, hint_text:text():find(name.."! ", 1, true)) 68 | local length = utf8.len(name) 69 | if x and length then 70 | x = x > 5 and x - 1 - ((#text - utf8.len(text)) - (#name - length)) or x - 1 71 | local color = data.peer_id 72 | hint_text:set_range_color(x, x + length, tweak_data.chat_colors[color] or tweak_data.chat_colors[#tweak_data.chat_colors]) 73 | end 74 | end 75 | end 76 | end 77 | end 78 | 79 | function HUDHint:color_by_name(hint_text, name, color) 80 | if VoidUI.options.hint_color then 81 | local x = select(1, hint_text:text():find(name, 1, true)) - 1 82 | local length = utf8.len(name) 83 | hint_text:set_range_color(x, x + length, color) 84 | end 85 | end 86 | 87 | function HUDHint:_animate_show(hint_panel, done_cb, params) 88 | local text = string.format(" %1s ",params.text) 89 | local seconds = params.time or 3 90 | local scale = VoidUI.options.hint_scale 91 | local clip_panel = hint_panel:child("clip_panel") 92 | local hint_text = clip_panel:child("hint_text") 93 | local hint_text_shadow = clip_panel:child("hint_text_shadow") 94 | hint_panel:set_visible(true) 95 | hint_panel:set_alpha(1) 96 | local target_s = 25 * scale 97 | local start_s = hint_text:text() ~= text and 0 or target_s 98 | local add = 5 * scale 99 | hint_text:set_text(text) 100 | hint_text_shadow:set_text(text) 101 | hint_text:set_color(Color.white) 102 | hint_text:set_font_size(target_s + add) 103 | hint_text_shadow:set_font_size(target_s + add) 104 | local _, _, w, h = hint_text:text_rect() 105 | hint_text:set_w(w) 106 | hint_text_shadow:set_w(w) 107 | clip_panel:set_w(w) 108 | clip_panel:set_center_x(clip_panel:parent():w() / 2) 109 | clip_panel:set_w(w) 110 | hint_panel:set_h(h) 111 | clip_panel:set_h(h) 112 | hint_text:set_h(h) 113 | hint_text_shadow:set_h(h) 114 | 115 | if params.name and params.color then 116 | self:color_by_name(hint_text, params.name, params.color) 117 | else 118 | self:color_by_names(hint_text, text) 119 | end 120 | 121 | local s = start_s 122 | local t = seconds 123 | local forever = t == -1 124 | if VoidUI.options.hint_anim then 125 | local speed = 150 * scale 126 | while s < target_s + add do 127 | local dt = coroutine.yield() 128 | s = s + dt * speed 129 | hint_text:set_font_size(s) 130 | hint_text_shadow:set_font_size(s) 131 | end 132 | hint_text:set_font_size(target_s + add) 133 | hint_text_shadow:set_font_size(target_s + add) 134 | while s > target_s do 135 | local dt = coroutine.yield() 136 | s = s - dt * (speed / 5) 137 | hint_text:set_font_size(s) 138 | hint_text_shadow:set_font_size(s) 139 | end 140 | hint_text:set_font_size(target_s) 141 | hint_text_shadow:set_font_size(target_s) 142 | while (t > 0 or forever) and not self._stop do 143 | local dt = coroutine.yield() 144 | t = t - dt 145 | end 146 | self._stop = false 147 | while s < target_s + add do 148 | local dt = coroutine.yield() 149 | s = s + dt * speed / 5 150 | hint_text:set_font_size(s) 151 | hint_text_shadow:set_font_size(s) 152 | end 153 | hint_text:set_font_size(target_s + add) 154 | hint_text_shadow:set_font_size(target_s + add) 155 | while s > 0 do 156 | local dt = coroutine.yield() 157 | s = s - dt * speed 158 | hint_text:set_font_size(s) 159 | hint_text_shadow:set_font_size(s) 160 | end 161 | hint_text:set_font_size(0) 162 | hint_text_shadow:set_font_size(0) 163 | else 164 | local speed = 400 165 | hint_text:set_font_size(target_s) 166 | hint_text_shadow:set_font_size(target_s) 167 | while s < 100 do 168 | local dt = coroutine.yield() 169 | s = math.clamp(s + dt * speed, 0, 100) 170 | hint_panel:set_alpha(s/100) 171 | end 172 | while (t > 0 or forever) and not self._stop do 173 | local dt = coroutine.yield() 174 | t = t - dt 175 | end 176 | self._stop = false 177 | while s > 0 do 178 | local dt = coroutine.yield() 179 | s = math.clamp(s - dt * speed, 0, 100) 180 | hint_panel:set_alpha(s/100) 181 | end 182 | end 183 | hint_panel:set_visible(false) 184 | hint_text:set_font_size(25) 185 | hint_text_shadow:set_font_size(25) 186 | hint_text:set_text("") 187 | hint_text_shadow:set_text("") 188 | done_cb() 189 | end 190 | 191 | function HUDHint:show_done() 192 | end 193 | end -------------------------------------------------------------------------------- /lua/hud/HudInteraction.lua: -------------------------------------------------------------------------------- 1 | if VoidUI.options.enable_interact then 2 | function HUDInteraction:init(hud, child_name) 3 | self._hud_panel = hud.panel 4 | self._scale = VoidUI.options.interact_scale 5 | self._circle_radius = 0 6 | self._child_name_text = (child_name or "interact") .. "_text" 7 | self._child_name_bg = (child_name or "interact") .. "_bg" 8 | self._child_ivalid_name_text = (child_name or "interact") .. "_invalid_text" 9 | if self._hud_panel:child(self._child_name_text) then 10 | self._hud_panel:remove(self._hud_panel:child(self._child_name_text)) 11 | end 12 | if self._hud_panel:child(self._child_name_bg) then 13 | self._hud_panel:remove(self._hud_panel:child(self._child_name_bg)) 14 | end 15 | if self._hud_panel:child(self._child_ivalid_name_text) then 16 | self._hud_panel:remove(self._hud_panel:child(self._child_ivalid_name_text)) 17 | end 18 | local interact_bg = self._hud_panel:text({ 19 | name = self._child_name_bg, 20 | alpha = 0, 21 | x = 1, 22 | y = 1, 23 | text = "", 24 | vertical = "bottom", 25 | align = "center", 26 | layer = 11, 27 | color = Color.black, 28 | visible = false, 29 | font = tweak_data.menu.pd2_large_font, 30 | font_size = tweak_data.hud_present.text_size / 1.2 * self._scale, 31 | h = 64 * self._scale 32 | }) 33 | local interact_text = self._hud_panel:text({ 34 | name = self._child_name_text, 35 | alpha = 0, 36 | text = "", 37 | vertical = "bottom", 38 | align = "center", 39 | layer = 12, 40 | visible = false, 41 | font = tweak_data.menu.pd2_large_font, 42 | font_size = tweak_data.hud_present.text_size / 1.2 * self._scale, 43 | h = 64 * self._scale 44 | }) 45 | local invalid_text = self._hud_panel:text({ 46 | name = self._child_ivalid_name_text, 47 | visible = false, 48 | alpha = 0, 49 | text = "", 50 | vertical = "bottom", 51 | align = "center", 52 | layer = 13, 53 | visible = false, 54 | color = Color(1, 0.3, 0.3), 55 | blend_mode = "normal", 56 | font = tweak_data.menu.pd2_large_font, 57 | font_size = tweak_data.hud_present.text_size / 1.2 * self._scale, 58 | h = 32 * self._scale 59 | }) 60 | local interaction_time = self._hud_panel:text({ 61 | name = "interaction_time", 62 | alpha = 1, 63 | visible = false, 64 | text = "1s", 65 | valign = "center", 66 | align = "center", 67 | layer = 2, 68 | color = Color.white, 69 | font = tweak_data.menu.pd2_medium_font, 70 | font_size = tweak_data.hud_present.text_size / 1.5 * self._scale, 71 | h = 32 * self._scale 72 | }) 73 | local interaction_time_bg = self._hud_panel:text({ 74 | name = "interaction_time_bg", 75 | alpha = 1, 76 | visible = false, 77 | text = "1s", 78 | valign = "center", 79 | align = "center", 80 | layer = 1, 81 | color = Color.black, 82 | font = tweak_data.menu.pd2_medium_font, 83 | font_size = tweak_data.hud_present.text_size / 1.5 * self._scale, 84 | h = 32 * self._scale 85 | }) 86 | interact_text:set_y(self._hud_panel:h() / 2 + VoidUI.options.interact_y) 87 | invalid_text:set_bottom(interact_text:bottom()) 88 | interaction_time:set_top(interact_text:bottom() + 10 * self._scale) 89 | interaction_time_bg:set_position(1, interaction_time:y() + 1) 90 | end 91 | 92 | function HUDInteraction:show_interact(data) 93 | self._hud_panel:child(self._child_name_bg):set_y(self._hud_panel:h() / 2 + VoidUI.options.interact_y + 1) 94 | self._hud_panel:child(self._child_name_text):set_y(self._hud_panel:h() / 2 + VoidUI.options.interact_y) 95 | self._hud_panel:child(self._child_ivalid_name_text):set_bottom(self._hud_panel:child(self._child_name_text):bottom()) 96 | self._hud_panel:child("interaction_time"):set_top(self._hud_panel:child(self._child_name_text):bottom() + 10 * self._scale) 97 | 98 | local text = utf8.to_upper(data.text or "Press 'F' to pay respects") 99 | self._hud_panel:child(self._child_name_text):set_visible(true) 100 | self._hud_panel:child(self._child_name_text):set_text(text) 101 | self._hud_panel:child(self._child_name_bg):set_text(text) 102 | 103 | self._hud_panel:child(self._child_name_text):stop() 104 | self._hud_panel:child(self._child_name_text):animate(callback(self, self, "_animate_interaction"),self._hud_panel:child(self._child_name_bg), self._hud_panel:child(self._child_ivalid_name_text), 1) 105 | end 106 | 107 | function HUDInteraction:remove_interact() 108 | if not alive(self._hud_panel) then 109 | return 110 | end 111 | self._hud_panel:child(self._child_name_text):stop() 112 | self._hud_panel:child(self._child_name_text):animate(callback(self, self, "_animate_interaction"),self._hud_panel:child(self._child_name_bg), self._hud_panel:child(self._child_ivalid_name_text), 0) 113 | end 114 | 115 | function HUDInteraction:_animate_interaction(interact_text, interact_bg, invalid_text, goal) 116 | local current = self._hud_panel:child(self._child_name_text):alpha() 117 | if goal == 1 then 118 | interact_text:set_visible(true) 119 | interact_bg:set_visible(true) 120 | end 121 | local TOTAL_T = 0.2 122 | local t = 0 123 | while TOTAL_T > t do 124 | local dt = coroutine.yield() 125 | t = t + dt 126 | local a = math.lerp(current,goal, t / TOTAL_T) 127 | interact_text:set_alpha(a) 128 | interact_bg:set_alpha(a) 129 | invalid_text:set_alpha(a) 130 | end 131 | if goal == 0 then 132 | interact_text:set_visible(false) 133 | interact_bg:set_visible(false) 134 | invalid_text:set_visible(false) 135 | end 136 | end 137 | function HUDInteraction:show_interaction_bar(current, total) 138 | if self._interact_circle then 139 | self._interact_circle:remove() 140 | self._interact_circle = nil 141 | end 142 | if self._interact_bar and self._interact_bar_bg then 143 | self._hud_panel:remove(self._interact_bar_bg) 144 | self._hud_panel:remove(self._interact_bar) 145 | self._interact_bar_bg = nil 146 | self._interact_bar = nil 147 | end 148 | local _, _, text_w, _ = self._hud_panel:child(self._child_name_text):text_rect() 149 | self._interact_bar_bg = self._hud_panel:bitmap({ 150 | layer = 12, 151 | w = text_w, 152 | h = 10 * self._scale, 153 | color = Color.black:with_alpha(1) 154 | }) 155 | self._interact_bar = self._hud_panel:bitmap({ 156 | layer = 13, 157 | w = 0, 158 | h = 6 * self._scale, 159 | color = Color.white:with_alpha(1) 160 | }) 161 | self._interact_circle = CircleBitmapGuiObject:new(self._hud_panel, { 162 | use_bg = true, 163 | radius = 0, 164 | sides = 0, 165 | current = 0, 166 | total = 0, 167 | color = Color.white, 168 | alpha = 0, 169 | blend_mode = "add", 170 | layer = 2 171 | }) 172 | self._interact_bar_bg:set_position(self._hud_panel:w() / 2 - (text_w / 2), self._hud_panel:child(self._child_name_text):y() + 64 * self._scale) 173 | self._interact_bar:set_position(self._hud_panel:w() / 2 - ((text_w - 4) / 2), self._hud_panel:child(self._child_name_text):y() + 66 * self._scale) 174 | end 175 | function HUDInteraction:set_interaction_bar_width(current, total) 176 | if not self._interact_circle then 177 | return 178 | end 179 | local _, _, text_w, _ = self._hud_panel:child(self._child_name_text):text_rect() 180 | self._interact_bar_bg:set_w(text_w) 181 | self._interact_bar:set_w(math.max((text_w - (4 * self._scale)) * (current / total), 0)) 182 | self._interact_bar_bg:set_x(self._hud_panel:w() / 2 - (text_w / 2)) 183 | if VoidUI.options.center_interaction and VoidUI.options.center_interaction or false then 184 | self._interact_bar:set_center_x(self._interact_bar_bg:center_x()) 185 | else 186 | self._interact_bar:set_x(self._hud_panel:w() / 2 - ((text_w - (4 * self._scale)) / 2)) 187 | end 188 | self._hud_panel:child("interaction_time"):set_visible(total - current > 0 and VoidUI.options.show_interact or false) 189 | self._hud_panel:child("interaction_time_bg"):set_visible(self._hud_panel:child("interaction_time"):visible()) 190 | if total - current > 0 then 191 | self._hud_panel:child("interaction_time"):set_text(string.format("%.1fs", total - current)) 192 | self._hud_panel:child("interaction_time_bg"):set_text(string.format("%.1fs", total - current)) 193 | end 194 | local bg = self._interact_circle._bg_circle 195 | if self._interact_circle_locked and self._interact_circle_locked._circle:alpha() > 0 then 196 | self._interact_bar_bg:set_color(Color(0.015,0.1,0.015)) 197 | elseif bg and alive(bg) and bg:alpha() ~= 1 then 198 | self._interact_bar_bg:set_color(Color(bg:alpha(),0,0)) 199 | end 200 | end 201 | function HUDInteraction:hide_interaction_bar(complete) 202 | if complete then 203 | local _, _, text_w, _ = self._hud_panel:child(self._child_name_text):text_rect() 204 | local bar = self._hud_panel:bitmap({ 205 | layer = 5, 206 | w = text_w - 4, 207 | h = 6 * self._scale, 208 | color = Color.white:with_alpha(1) 209 | }) 210 | bar:set_position(self._hud_panel:w() / 2 - ((text_w - 4) / 2), self._hud_panel:child(self._child_name_text):y() + 66 * self._scale) 211 | bar:animate(callback(self, self, "_animate_interaction_complete_custom"), bar) 212 | end 213 | if self._interact_circle then 214 | self._interact_circle:remove() 215 | self._interact_circle = nil 216 | end 217 | 218 | if self._interact_bar and self._interact_bar_bg then 219 | self._hud_panel:remove(self._interact_bar_bg) 220 | self._hud_panel:remove(self._interact_bar) 221 | self._interact_bar_bg = nil 222 | self._interact_bar = nil 223 | 224 | end 225 | self._hud_panel:child("interaction_time"):set_visible(false) 226 | self._hud_panel:child("interaction_time_bg"):set_visible(false) 227 | 228 | end 229 | function HUDInteraction:set_bar_valid(valid, text_id) 230 | local color = valid and Color.white or Color(1, 0.3, 0.3) 231 | self._interact_bar:set_color(color) 232 | self._hud_panel:child(self._child_name_text):set_visible(valid) 233 | local invalid_text = self._hud_panel:child(self._child_ivalid_name_text) 234 | local valid_text = self._hud_panel:child(self._child_name_text) 235 | if text_id then 236 | invalid_text:set_text(managers.localization:to_upper_text(text_id)) 237 | end 238 | invalid_text:set_visible(not valid) 239 | self._hud_panel:child(self._child_name_bg):set_text(valid and valid_text:text() or invalid_text:text()) 240 | end 241 | function HUDInteraction:destroy() 242 | self._hud_panel:remove(self._hud_panel:child(self._child_name_text)) 243 | self._hud_panel:remove(self._hud_panel:child(self._child_ivalid_name_text)) 244 | if self._interact_bar and self._interact_bar_bg then 245 | self._hud_panel:remove(self._interact_bar_bg) 246 | self._hud_panel:remove(self._interact_bar) 247 | self._interact_bar_bg = nil 248 | self._interact_bar = nil 249 | end 250 | end 251 | function HUDInteraction:_animate_interaction_complete_custom(bar) 252 | local TOTAL_T = 0.2 253 | local t = 0 254 | local w = bar:w() 255 | local y = bar:center_y() 256 | while TOTAL_T > t do 257 | local dt = coroutine.yield() 258 | t = t + dt 259 | bar:set_size(math.lerp(w, w * 2, t / TOTAL_T), math.lerp(6 * self._scale, 1, t / TOTAL_T)) 260 | bar:set_x(self._hud_panel:w() / 2 - ((bar:w() - 4) / 2)) 261 | bar:set_center_y(y) 262 | end 263 | self._hud_panel:remove(bar) 264 | end 265 | end -------------------------------------------------------------------------------- /lua/hud/HudObjectives.lua: -------------------------------------------------------------------------------- 1 | if VoidUI.options.enable_objectives then 2 | function HUDObjectives:init(hud) 3 | self._hud_panel = hud.panel 4 | self._objectives = {} 5 | self.objective_amount = {} 6 | if self._hud_panel:child("objectives_panel") then 7 | self._hud_panel:remove(self._hud_panel:child("objectives_panel")) 8 | end 9 | self._scale = VoidUI.options.hud_objectives_scale 10 | self._max_objectives = math.floor(VoidUI.options.hud_objective_history) 11 | 12 | local objectives_panel = self._hud_panel:panel({ 13 | visible = VoidUI.options.show_objectives == 3, 14 | name = "objectives_panel", 15 | h = 200 * self._scale, 16 | w = 500 * self._scale, 17 | y = VoidUI.options.show_timer == 2 and VoidUI.options.show_objectives == 3 and -(32 * self._scale) or 0 18 | }) 19 | end 20 | 21 | function HUDObjectives:create_objective(id , data) 22 | local objective_id = id 23 | local objectives_panel = self._hud_panel:child("objectives_panel") 24 | 25 | local objective_panel = objectives_panel:panel({ 26 | visible = true, 27 | x = 0, 28 | y = 40 * self._scale + ((32 * self._scale) * #self._objectives), 29 | h = 30 * self._scale, 30 | w = 500 * self._scale, 31 | }) 32 | 33 | local objective_text = objective_panel:text({ 34 | name = "objective_text", 35 | visible = true, 36 | layer = 2, 37 | color = Color.white, 38 | text = data.text, 39 | font_size = tweak_data.hud.active_objective_title_font_size * self._scale, 40 | font = tweak_data.hud.medium_font_noshadow, 41 | x = 15 * self._scale, 42 | y = 2 * self._scale, 43 | h = 30 * self._scale, 44 | rotation = 360, 45 | align = "left", 46 | }) 47 | objective_text:set_font_size(tweak_data.hud.active_objective_title_font_size * self._scale) 48 | local _, _, name_w, name_h = objective_text:text_rect() 49 | local weapons_texture = "guis/textures/VoidUI/hud_weapons" 50 | local objective_text_bg_left = objective_panel:bitmap({ 51 | name = "objective_text_bg_left", 52 | texture = weapons_texture, 53 | texture_rect = {26,0,43,150}, 54 | layer = 1, 55 | y = 0, 56 | w = 25 * self._scale, 57 | h = 30 * self._scale, 58 | rotation = 360, 59 | alpha = 1 60 | }) 61 | local objective_text_bg = objective_panel:bitmap({ 62 | name = "objective_text_bg", 63 | texture = weapons_texture, 64 | texture_rect = {69,0,416,150}, 65 | layer = 1, 66 | w = name_w - 17 * self._scale, 67 | h = 30 * self._scale, 68 | x = 25 * self._scale, 69 | y = 0, 70 | rotation = 360, 71 | alpha = 1 72 | }) 73 | local objective_text_bg_right = objective_panel:bitmap({ 74 | name = "objective_text_bg_right", 75 | texture = weapons_texture, 76 | texture_rect = {485,0,43,150}, 77 | layer = 1, 78 | y = 0, 79 | w = 25 * self._scale, 80 | h = 30 * self._scale, 81 | rotation = 360, 82 | alpha = 1 83 | }) 84 | objective_text_bg_right:set_left(objective_text_bg:right()) 85 | 86 | local highlight_texture = "guis/textures/VoidUI/hud_highlights" 87 | local objective_border = objective_panel:bitmap({ 88 | name = "objective_border", 89 | texture = highlight_texture, 90 | texture_rect = {0,158,460,157}, 91 | layer = 2, 92 | x = -50 * self._scale, 93 | y = 0, 94 | w = name_w + 10 * self._scale, 95 | h = 30 * self._scale, 96 | rotation = 360, 97 | alpha = 0, 98 | color = Color(0, 0.5, 0) 99 | }) 100 | 101 | local objective_border_right = objective_panel:bitmap({ 102 | name = "objective_border_right", 103 | texture = highlight_texture, 104 | texture_rect = {460,158,43,157}, 105 | layer = 2, 106 | y = 0, 107 | w = 25 * self._scale, 108 | h = 30 * self._scale, 109 | rotation = 360, 110 | alpha = 0, 111 | color = Color(0, 0.5, 0) 112 | }) 113 | objective_border_right:set_left(objective_border:right()) 114 | objective_panel:set_x(-500) 115 | table.insert(self._objectives, objective_panel) 116 | objective_panel:animate(callback(self, self, "_animate_spawn_objective")) 117 | end 118 | 119 | function HUDObjectives:_animate_spawn_objective(objective_panel) 120 | local TOTAL_T = 0.5 121 | local t = 0 122 | while TOTAL_T > t do 123 | local dt = coroutine.yield() 124 | t = t + dt 125 | objective_panel:set_x(math.lerp(-500, 0, t / TOTAL_T)) 126 | objective_panel:set_alpha(math.lerp(0, 1, t / 0.4)) 127 | end 128 | objective_panel:set_x(0) 129 | end 130 | 131 | function HUDObjectives:activate_objective(data) 132 | if data.id == self._active_objective_id then 133 | return 134 | end 135 | local objectives_panel = self._hud_panel:child("objectives_panel") 136 | local objective_panel = self._objectives[#self._objectives] 137 | self._active_objective_id = data.id 138 | if objective_panel ~= nil and objective_panel:child("objective_border"):alpha() ~= 1 then 139 | objective_panel:animate(callback(self, self, "_animate_complete_objective")) 140 | end 141 | 142 | if #self._objectives > self._max_objectives then 143 | self._objectives[1]:animate(callback(self, self, "_animate_remove_objective")) 144 | table.remove(self._objectives, 1) 145 | for i = 1, #self._objectives do 146 | self._objectives[i]:animate(callback(self, self, "_animate_objective_list"), i - 1) 147 | end 148 | end 149 | self:create_objective(data.id, data) 150 | if data.amount then 151 | self:update_amount_objective(data) 152 | end 153 | end 154 | 155 | function HUDObjectives:_animate_objective_list(objective_panel, spot) 156 | local TOTAL_T = 0.4 157 | local t = 0 158 | local y = objective_panel:y() 159 | local end_y = 40 * self._scale + ((32 * self._scale) * spot) 160 | while TOTAL_T > t do 161 | local dt = coroutine.yield() 162 | t = t + dt 163 | objective_panel:set_y(math.lerp(y, end_y, t / TOTAL_T)) 164 | end 165 | end 166 | 167 | function HUDObjectives:complete_objective(data) 168 | print("[HUDObjectives] complete_objective", data.id, self._active_objective_id) 169 | if self.objective_amount[data.id] then 170 | if self.objective_amount[data.id].current ~= self.objective_amount[data.id].total then 171 | self:fix_previous_objective({id = data.id, amount = self.objective_amount[data.id].total, text = data.text}) 172 | end 173 | self.objective_amount[data.id] = nil 174 | end 175 | if data.id ~= self._active_objective_id then 176 | return 177 | end 178 | local objectives_panel = self._hud_panel:child("objectives_panel") 179 | local objective_panel = self._objectives[#self._objectives] 180 | objective_panel:animate(callback(self, self, "_animate_complete_objective")) 181 | end 182 | 183 | function HUDObjectives:fix_previous_objective(data) 184 | local total_amount = data.amount 185 | for i, panel in pairs(self._objectives) do 186 | if panel:child("objective_text"):text() == data.text..": "..tostring(total_amount-1).."/"..tostring(total_amount) then 187 | local objective_text = panel:child("objective_text") 188 | objective_text:set_text(data.text..": ".. tostring(total_amount).."/"..tostring(total_amount)) 189 | end 190 | end 191 | end 192 | 193 | function HUDObjectives:_animate_complete_objective(objective_panel) 194 | local objective_border = objective_panel:child("objective_border") 195 | local objective_border_right = objective_panel:child("objective_border_right") 196 | local objective_text = objective_panel:child("objective_text") 197 | local x = objective_border:x() 198 | local TOTAL_T = 0.5 199 | local t = 0 200 | while TOTAL_T > t do 201 | local dt = coroutine.yield() 202 | t = t + dt 203 | objective_border:set_x(math.lerp(x, 1, t / TOTAL_T)) 204 | objective_border:set_alpha(math.lerp(0, 1, t / TOTAL_T)) 205 | objective_border_right:set_left(objective_border:right() - 1) 206 | objective_border_right:set_alpha(objective_border:alpha()) 207 | local rb = math.lerp(1, 0, t / TOTAL_T) 208 | local g = math.lerp(1, 0.5, t / TOTAL_T) 209 | objective_text:set_color(Color(rb,g,rb)) 210 | end 211 | objective_border:set_x(1) 212 | objective_border:set_alpha(1) 213 | objective_border_right:set_left(objective_border:right() - 1) 214 | objective_border_right:set_alpha(objective_border:alpha()) 215 | objective_text:set_color(Color(0,0.5,0)) 216 | objective_text:set_font_size(tweak_data.hud.active_objective_title_font_size * self._scale) 217 | end 218 | 219 | function HUDObjectives:_animate_remove_objective(objective_panel) 220 | local x = objective_panel:x() 221 | local TOTAL_T = 0.5 222 | local t = 0 223 | while TOTAL_T > t do 224 | local dt = coroutine.yield() 225 | t = t + dt 226 | objective_panel:set_x(math.lerp(x, -500, t / TOTAL_T)) 227 | objective_panel:set_alpha(math.lerp(1, 0, t / TOTAL_T)) 228 | end 229 | objectives_panel:remove(objective_panel) 230 | end 231 | 232 | function HUDObjectives:update_amount_objective(data) 233 | if data.id ~= self._active_objective_id then 234 | return 235 | end 236 | local current = data.current_amount or 0 237 | local total = data.amount 238 | self.objective_amount[data.id] = {current = current, total = total} 239 | local objective_panel = self._objectives[#self._objectives] 240 | local objective_text = objective_panel:child("objective_text") 241 | local objective_text_bg = objective_panel:child("objective_text_bg") 242 | local objective_border = objective_panel:child("objective_border") 243 | local objective_text_bg_right = objective_panel:child("objective_text_bg_right") 244 | objective_panel:child("objective_text"):set_text(data.text..": ".. current .. "/" .. total) 245 | objective_text:set_font_size(tweak_data.hud.active_objective_title_font_size * self._scale) 246 | if current > 0 then objective_panel:child("objective_text"):animate(callback(self, self, "_animate_objective_count")) end 247 | local _, y, w, h = objective_panel:child("objective_text"):text_rect() 248 | objective_text_bg:set_size(w - 17 * self._scale, 30 * self._scale) 249 | objective_text_bg_right:set_left(objective_text_bg:right()) 250 | objective_border:set_w(w + 10 * self._scale) 251 | end 252 | 253 | function HUDObjectives:_animate_objective_count(objective_text) 254 | local size = objective_text:font_size() 255 | local TOTAL_T = 0.2 256 | local t = 0 257 | while TOTAL_T > t do 258 | local dt = coroutine.yield() 259 | t = t + dt 260 | objective_text:set_font_size(math.lerp(size * 1.2, size, t / TOTAL_T)) 261 | end 262 | objective_text:set_font_size(tweak_data.hud.active_objective_title_font_size * self._scale) 263 | end 264 | 265 | 266 | function HUDObjectives:remind_objective(id) 267 | end 268 | else 269 | local init = HUDObjectives.init 270 | function HUDObjectives:init(hud) 271 | init(self, hud) 272 | if VoidUI.options.enable_timer then 273 | hud.panel:child("objectives_panel"):set_y(VoidUI.options.show_timer < 3 and 0 or 40 * VoidUI.options.hud_objectives_scale) 274 | end 275 | end 276 | end 277 | -------------------------------------------------------------------------------- /lua/hud/HudPlayerDowned.lua: -------------------------------------------------------------------------------- 1 | if RequiredScript == "lib/managers/hud/hudplayerdowned" and VoidUI.options.teammate_panels then 2 | 3 | function HUDPlayerDowned:init(hud) 4 | self._hud = hud 5 | self._hud_panel = hud.panel 6 | self._hud_panel:set_layer(0) 7 | if self._hud_panel:child("downed_panel") then 8 | self._hud_panel:remove(self._hud_panel:child("downed_panel")) 9 | end 10 | local player = managers.hud._teammate_panels[HUDManager.PLAYER_PANEL] 11 | local player_panel = player._custom_player_panel 12 | local downed_panel = self._hud_panel:panel({ 13 | name = "downed_panel", 14 | w = player._health_w, 15 | h = player._bg_h, 16 | x = player_panel:child("health_panel"):world_x(), 17 | y = player_panel:child("health_panel"):world_y(), 18 | }) 19 | 20 | local downed_bar = downed_panel:bitmap({ 21 | name = "downed_bar", 22 | texture = "guis/textures/VoidUI/hud_health", 23 | texture_rect = {203,0,202,472}, 24 | layer = 4, 25 | w = player._health_w, 26 | h = player._bg_h, 27 | alpha = 1, 28 | }) 29 | local downed_icon = downed_panel:bitmap({ 30 | name = "downed_icon", 31 | layer = 8, 32 | w = downed_panel:w() / 1.5, 33 | h = downed_panel:w() / 1.5, 34 | alpha = 0.5, 35 | }) 36 | downed_icon:set_bottom(downed_bar:h() - 2) 37 | downed_icon:set_center_x(downed_bar:center_x() - 5) 38 | self._hud.timer:set_size(player._health_value, player._health_value) 39 | self._hud.timer:set_font(Idstring(tweak_data.hud.medium_font_noshadow)) 40 | self._hud.timer:set_font_size(player._health_value / 1.4) 41 | self._hud.timer:set_x(downed_panel:x()) 42 | self._hud.timer:set_bottom(downed_panel:bottom()) 43 | self._hud.timer:set_align("center") 44 | self._hud.timer:set_vertical("bottom") 45 | self._hud.timer:set_layer(10) 46 | self._hud.arrest_finished_text:set_font(Idstring(tweak_data.hud.medium_font_noshadow)) 47 | self._hud.arrest_finished_text:set_font_size(tweak_data.hud_mask_off.text_size) 48 | self:set_arrest_finished_text() 49 | local _, _, w, h = self._hud.arrest_finished_text:text_rect() 50 | self._hud.arrest_finished_text:set_h(h) 51 | self._hud.arrest_finished_text:set_y(28) 52 | self._hud.arrest_finished_text:set_center_x(self._hud_panel:center_x()) 53 | end 54 | 55 | function HUDPlayerDowned:start_timer(time) 56 | self._hud_panel:child("downed_panel"):stop() 57 | self._hud_panel:child("downed_panel"):animate(callback(self, self, "_aimate_timer"), time) 58 | end 59 | function HUDPlayerDowned:_aimate_timer(downed_panel, time) 60 | local player_panel = managers.hud._teammate_panels[HUDManager.PLAYER_PANEL]._custom_player_panel 61 | downed_panel:set_position(player_panel:child("health_panel"):world_x(), player_panel:child("health_panel"):world_y()) 62 | self._hud.timer:set_x(downed_panel:x()) 63 | self._hud.timer:set_bottom(downed_panel:bottom()) 64 | local downed_bar = downed_panel:child("downed_bar") 65 | local total_time = time 66 | local amount = time / total_time 67 | downed_bar:set_h(downed_panel:h()) 68 | downed_bar:set_texture_rect(203, 0, 202, 472) 69 | downed_bar:set_bottom(downed_panel:h()) 70 | self._hud.timer:set_text(time) 71 | while time >= 0 do 72 | local dt = coroutine.yield() 73 | if self._hud.paused == false then 74 | time = time - dt 75 | amount = time / total_time 76 | self._hud.timer:set_text(math.round(time)) 77 | downed_bar:set_h(amount * downed_panel:h()) 78 | downed_bar:set_texture_rect(203, (1- amount) * 472, 202, 472 * amount) 79 | downed_bar:set_bottom(downed_panel:h()) 80 | end 81 | end 82 | end 83 | function HUDPlayerDowned:on_downed() 84 | local icon, texture_rect = tweak_data.hud_icons:get_icon_data("mugshot_downed") 85 | local downed_panel = self._hud_panel:child("downed_panel") 86 | local downed_bar = downed_panel:child("downed_bar") 87 | local downed_icon = downed_panel:child("downed_icon") 88 | downed_bar:set_color(tweak_data.screen_colors.pro_color * 0.7 + Color.black * 0.9) 89 | self._hud.timer:set_color(tweak_data.screen_colors.pro_color * 0.4 + Color.black * 0.9) 90 | downed_icon:set_color(tweak_data.screen_colors.pro_color) 91 | downed_icon:set_image(icon, texture_rect[1], texture_rect[2], texture_rect[3], texture_rect[4]) 92 | end 93 | function HUDPlayerDowned:on_arrested() 94 | local icon, texture_rect = tweak_data.hud_icons:get_icon_data("mugshot_cuffed") 95 | local downed_panel = self._hud_panel:child("downed_panel") 96 | local downed_bar = downed_panel:child("downed_bar") 97 | local downed_icon = downed_panel:child("downed_icon") 98 | downed_bar:set_color(tweak_data.chat_colors[5] * 0.7 + Color.black * 0.9) 99 | self._hud.timer:set_color(tweak_data.chat_colors[5] * 0.4 + Color.black * 0.9) 100 | downed_icon:set_color(tweak_data.chat_colors[5]) 101 | downed_icon:set_image(icon, texture_rect[1], texture_rect[2], texture_rect[3], texture_rect[4]) 102 | end 103 | function HUDPlayerDowned:show_timer() 104 | local downed_panel = self._hud_panel:child("downed_panel") 105 | local downed_bar = downed_panel:child("downed_bar") 106 | self._hud.timer:set_visible(true) 107 | downed_bar:set_alpha(1) 108 | self._hud.timer:set_alpha(1) 109 | end 110 | function HUDPlayerDowned:hide_timer() 111 | local downed_panel = self._hud_panel:child("downed_panel") 112 | local downed_bar = downed_panel:child("downed_bar") 113 | downed_bar:set_alpha(0.8) 114 | self._hud.timer:set_alpha(0.9) 115 | end 116 | function HUDPlayerDowned:show_arrest_finished() 117 | self._hud.arrest_finished_text:set_visible(true) 118 | local downed_panel = self._hud_panel:child("downed_panel") 119 | self._hud.timer:set_visible(false) 120 | end 121 | 122 | elseif RequiredScript == "lib/units/beings/player/huskplayermovement" and (VoidUI.options.teammate_panels or (VoidUI.options.scoreboard and VoidUI.options.enable_stats)) then 123 | 124 | local start_bleedout = HuskPlayerMovement._perform_movement_action_enter_bleedout 125 | 126 | function HuskPlayerMovement:_perform_movement_action_enter_bleedout(...) 127 | local data = managers.criminals:character_data_by_unit(self._unit) 128 | if data and data.panel_id then 129 | managers.hud:player_downed(data.panel_id) 130 | end 131 | 132 | return start_bleedout(self, ...) 133 | end 134 | 135 | elseif RequiredScript == "lib/units/beings/player/states/playerbleedout" and (VoidUI.options.teammate_panels or (VoidUI.options.scoreboard and VoidUI.options.enable_stats)) then 136 | local start_bleedout = PlayerBleedOut._enter 137 | 138 | function PlayerBleedOut:_enter(...) 139 | managers.hud:player_downed(HUDManager.PLAYER_PANEL) 140 | return start_bleedout(self, ...) 141 | end 142 | 143 | elseif RequiredScript == "lib/network/handlers/unitnetworkhandler" then 144 | if VoidUI.options.teammate_panels or (VoidUI.options.scoreboard and VoidUI.options.enable_stats) then 145 | local doctor_bag_taken = UnitNetworkHandler.sync_doctor_bag_taken 146 | 147 | function UnitNetworkHandler:sync_doctor_bag_taken(unit, amount, sender, ...) 148 | local peer = self._verify_sender(sender) 149 | if peer then 150 | local data = managers.criminals:character_data_by_peer_id(peer:id()) 151 | if data and data.panel_id then 152 | managers.hud:keep_downs(data.panel_id) 153 | end 154 | end 155 | 156 | return doctor_bag_taken(self, unit, amount, sender, ...) 157 | end 158 | end 159 | 160 | if VoidUI.options.enable_assault then 161 | local teammate_interact = UnitNetworkHandler.sync_teammate_progress 162 | function UnitNetworkHandler:sync_teammate_progress(type_index, enabled, tweak_data_id, timer, success, sender) 163 | if tweak_data_id == "corpse_alarm_pager" and success == true then managers.hud:pager_used() end 164 | return teammate_interact(self, type_index, enabled, tweak_data_id, timer, success, sender) 165 | end 166 | end 167 | 168 | elseif RequiredScript == "lib/units/equipment/doctor_bag/doctorbagbase" and (VoidUI.options.teammate_panels or (VoidUI.options.scoreboard and VoidUI.options.enable_stats)) then 169 | 170 | local doctor_bag_taken = DoctorBagBase.take 171 | 172 | function DoctorBagBase:take(...) 173 | managers.hud:keep_downs(HUDManager.PLAYER_PANEL) 174 | 175 | return doctor_bag_taken(self, ...) 176 | end 177 | end -------------------------------------------------------------------------------- /lua/hud/HudPresenter.lua: -------------------------------------------------------------------------------- 1 | if RequiredScript == "lib/managers/hud/hudpresenter" and VoidUI.options.enable_presenter then 2 | function HUDPresenter:init(hud) 3 | self._hud_panel = hud.panel 4 | self._id = 0 5 | self._active = 0 6 | self._scale = VoidUI.options.presenter_scale 7 | end 8 | function HUDPresenter:present(params) 9 | self._present_queue = self._present_queue or {} 10 | if self._active > (VoidUI.options.presenter_buffer-1) then 11 | table.insert(self._present_queue, params) 12 | return 13 | end 14 | 15 | if self._active > 0 then 16 | for i = self._id - 1, self._id - self._active, -1 17 | do 18 | local present_panel = self._hud_panel:child("present_panel_"..i) 19 | if present_panel then 20 | local slot = present_panel:child("slot") 21 | slot:set_text(slot:text()+1) 22 | present_panel:animate(callback(self, self, "_animate_move_queue"), tonumber(slot:text())) 23 | end 24 | end 25 | end 26 | if params.present_mid_text then 27 | self:_present_information(params) 28 | end 29 | end 30 | 31 | function HUDPresenter:_present_information(params) 32 | local id = self._id 33 | self._active = self._active + 1 34 | self._id = self._id + 1 35 | local h = 40 * self._scale 36 | local w = 100 * self._scale 37 | local x = self._hud_panel:w() - 200 * self._scale 38 | local y = self._hud_panel:h() / 2 - (h / 2) 39 | local color = params.color or Color.white 40 | local present_panel = self._hud_panel:panel({ 41 | visible = false, 42 | name = "present_panel_"..id, 43 | layer = 10, 44 | x = x, 45 | y = y 46 | }) 47 | local slot = present_panel:text({ 48 | name = "slot", 49 | visible = false, 50 | text = "0", 51 | vertical = "top", 52 | valign = "center", 53 | layer = 0, 54 | font = tweak_data.hud_present.title_font, 55 | font_size = 10 56 | }) 57 | local weapons_texture = "guis/textures/VoidUI/hud_weapons" 58 | local present_bg_left = present_panel:bitmap({ 59 | name = "present_bg_left", 60 | texture = weapons_texture, 61 | texture_rect = {26,0,43,150}, 62 | layer = 1, 63 | y = 0, 64 | w = 35 * self._scale, 65 | h = h, 66 | rotation = 360, 67 | }) 68 | local present_border_left = present_panel:bitmap({ 69 | name = "present_border_left", 70 | texture = "guis/textures/VoidUI/hud_highlights", 71 | texture_rect = {0,0,23,157}, 72 | layer = 2, 73 | y = 0, 74 | w = 15 * self._scale, 75 | h = h, 76 | rotation = 360, 77 | color = color, 78 | visible = params.border and true or false, 79 | }) 80 | local present_bg = present_panel:bitmap({ 81 | name = "present_bg", 82 | texture = weapons_texture, 83 | texture_rect = {69,0,416,150}, 84 | layer = 1, 85 | w = w, 86 | h = h, 87 | x = 35 * self._scale, 88 | y = 0, 89 | rotation = 360, 90 | }) 91 | local present_border = present_panel:bitmap({ 92 | name = "present_border", 93 | texture = "guis/textures/VoidUI/hud_highlights", 94 | texture_rect = {23,0,480,157}, 95 | layer = 2, 96 | w = w, 97 | h = h, 98 | x = 15 * self._scale, 99 | y = 0, 100 | rotation = 360, 101 | color = color, 102 | visible = params.border and true or false, 103 | }) 104 | local present_bg_right = present_panel:bitmap({ 105 | name = "present_bg_right", 106 | texture = weapons_texture, 107 | texture_rect = {485,0,43,150}, 108 | layer = 1, 109 | y = 0, 110 | w = 35 * self._scale, 111 | h = h, 112 | rotation = 360, 113 | }) 114 | present_bg_right:set_left(present_bg:right()) 115 | local title = present_panel:text({ 116 | name = "title", 117 | text = params.title or " ", 118 | vertical = "top", 119 | valign = "left", 120 | layer = 2, 121 | x = 15 * self._scale, 122 | color = color, 123 | rotation = 360, 124 | font = tweak_data.hud_present.title_font, 125 | font_size = tweak_data.hud_present.title_size / 1.5 * self._scale 126 | }) 127 | if params.title == nil and managers.skirmish:is_skirmish() then 128 | title:set_text(managers.localization:text("hud_skirmish")) 129 | end 130 | local _, _, title_w, title_h = title:text_rect() 131 | title:set_h(title_h) 132 | local text = present_panel:text({ 133 | name = "text", 134 | text = params.text or "", 135 | vertical = "top", 136 | valign = "top", 137 | layer = 2, 138 | x = 9 * self._scale, 139 | color = color, 140 | rotation = 360, 141 | font = tweak_data.hud_present.text_font, 142 | font_size = tweak_data.hud_present.text_size / 1.5 * self._scale 143 | }) 144 | local _, _, text_w, text_h = text:text_rect() 145 | text:set_top(title:bottom()) 146 | text:set_h(text_h) 147 | w = math.max(title_w, text_w) 148 | present_bg:set_w(w - 35 * self._scale) 149 | present_bg_right:set_left(present_bg:right()) 150 | present_panel:set_w(present_bg_left:w() + present_bg:w() + present_bg_right:w()) 151 | present_panel:set_right(self._hud_panel:right()) 152 | 153 | 154 | present_panel:animate(callback(self, self, "_animate_present_information")) 155 | 156 | if params.event and not VoidUI.options.presenter_sound then 157 | managers.hud._sound_source:post_event(params.event) 158 | end 159 | end 160 | function HUDPresenter:_animate_present_information(present_panel) 161 | present_panel:set_visible(true) 162 | present_panel:animate(callback(self, self, "_animate_show_panel")) 163 | wait(4) 164 | present_panel:animate(callback(self, self, "_animate_hide_panel")) 165 | wait(0.5) 166 | self._hud_panel:remove(present_panel) 167 | self._active = self._active - 1 168 | self:_present_done() 169 | end 170 | 171 | function HUDPresenter:_present_done() 172 | local queued = table.remove(self._present_queue, 1) 173 | if queued then 174 | setup:add_end_frame_clbk(callback(self, self, "_do_it", queued)) 175 | end 176 | end 177 | function HUDPresenter:_do_it(queued) 178 | self._present_queue = self._present_queue or {} 179 | if self._active > 5 then 180 | table.insert(self._present_queue, params) 181 | return 182 | end 183 | 184 | if self._active > 0 then 185 | for i = self._id - 1, self._id - self._active, -1 186 | do 187 | local present_panel = self._hud_panel:child("present_panel_"..i) 188 | if present_panel then 189 | local slot = present_panel:child("slot") 190 | slot:set_text(slot:text()+1) 191 | present_panel:animate(callback(self, self, "_animate_move_queue"), tonumber(slot:text())) 192 | end 193 | end 194 | end 195 | self:_present_information(queued) 196 | end 197 | function HUDPresenter:_animate_move_queue(present_panel, goal) 198 | local y = present_panel:y() 199 | local y2 = (self._hud_panel:h() / 2 - ((40 * self._scale ) / 2)) - (goal * (45 * self._scale)) 200 | local TOTAL_T = 0.2 201 | local t = 0 202 | while TOTAL_T > t do 203 | local dt = coroutine.yield() 204 | t = t + dt 205 | present_panel:set_y(math.lerp(y,y2, t / TOTAL_T)) 206 | end 207 | present_panel:set_y(y2) 208 | end 209 | 210 | function HUDPresenter:_animate_show_panel(present_panel) 211 | local x = present_panel:x() 212 | local x2 = present_panel:x() + present_panel:w() 213 | local TOTAL_T = 0.5 214 | local t = 0 215 | while TOTAL_T > t do 216 | local dt = coroutine.yield() 217 | t = t + dt 218 | present_panel:set_alpha(math.lerp(0,1, t / TOTAL_T)) 219 | present_panel:set_x(math.lerp(x2,x, t / TOTAL_T)) 220 | end 221 | present_panel:set_alpha(1) 222 | present_panel:set_x(x) 223 | end 224 | function HUDPresenter:_animate_hide_panel(present_panel) 225 | local x = present_panel:x() 226 | local x2 = present_panel:x() + present_panel:w() 227 | local TOTAL_T = 0.5 228 | local t = 0 229 | while TOTAL_T > t do 230 | local dt = coroutine.yield() 231 | t = t + dt 232 | present_panel:set_alpha(math.lerp(1, 0, t / TOTAL_T)) 233 | present_panel:set_x(math.lerp(x,x2, t / TOTAL_T)) 234 | x2 = x2 + (dt > 0 and 0.1 or 0) 235 | end 236 | present_panel:set_alpha(0) 237 | present_panel:set_x(x2) 238 | end 239 | elseif RequiredScript == "lib/managers/hud/hudchallengenotification" and VoidUI.options.enable_challanges then 240 | HudChallengeNotification.ICON_SIZE = 50 241 | HudChallengeNotification.BOX_MAX_W = 400 242 | function HudChallengeNotification:make_fine_text(text) 243 | local x, y, w, h = text:text_rect() 244 | 245 | text:set_size(w, h) 246 | text:set_position(math.round(text:x()), math.round(text:y())) 247 | end 248 | 249 | function HudChallengeNotification:_animate_show(title_panel, text_panel) 250 | local center = text_panel:center_x() 251 | local TOTAL_T = 0.3 252 | local t = 0 253 | while t < TOTAL_T do 254 | coroutine.yield() 255 | local dt = TimerManager:main():delta_time() 256 | t = t + dt 257 | title_panel:set_x(math.lerp(-title_panel:w(), self._hud:w() / 2 + 35 - text_panel:w() / 2, t / TOTAL_T)) 258 | text_panel:set_center_x(math.lerp(center, self._hud:w() / 2 + 35, t / TOTAL_T)) 259 | end 260 | title_panel:set_x(self._hud:w() / 2 + 35 - text_panel:w() / 2) 261 | text_panel:set_center_x(self._hud:w() / 2 + 35) 262 | local title_x = title_panel:x() 263 | TOTAL_T = 2 264 | t = 0 265 | while t < TOTAL_T do 266 | coroutine.yield() 267 | local dt = TimerManager:main():delta_time() 268 | t = t + dt 269 | title_panel:set_x(math.lerp(title_x, title_x + 35, t / TOTAL_T)) 270 | text_panel:set_center_x(math.lerp(self._hud:w() / 2 + 35, self._hud:w() / 2, t / TOTAL_T)) 271 | end 272 | title_x = title_panel:x() 273 | TOTAL_T = 0.3 274 | t = 0 275 | while t < TOTAL_T do 276 | coroutine.yield() 277 | local dt = TimerManager:main():delta_time() 278 | t = t + dt 279 | title_panel:set_x(math.lerp(title_x, self._hud:w(), t / TOTAL_T)) 280 | text_panel:set_center_x(math.lerp(self._hud:w() / 2, -text_panel:w() / 2, t / TOTAL_T)) 281 | end 282 | self:close() 283 | end 284 | 285 | function HudChallengeNotification:init(title, text, icon, rewards, queue) 286 | self._ws = managers.gui_data:create_fullscreen_workspace() 287 | self._scale = VoidUI.options.challanges_scale 288 | 289 | HudChallengeNotification.super.init(self, self._ws:panel()) 290 | self._queue = queue or {} 291 | self._hud = self._ws:panel() 292 | self._hud:set_layer(1000) 293 | local text_panel = self._hud:panel({}) 294 | local noti_text = text_panel:text({ 295 | text = utf8.to_lower(text):gsub("^%l", string.upper) or "Blame overkill!", 296 | font = tweak_data.menu.pd2_medium_font, 297 | font_size = tweak_data.menu.pd2_medium_font_size * self._scale, 298 | vertical = "center", 299 | x = 20 * self._scale, 300 | w = self.BOX_MAX_W * self._scale, 301 | wrap = true, 302 | word_wrap = true, 303 | layer = 2 304 | }) 305 | self:make_fine_text(noti_text) 306 | noti_text:set_h(noti_text:h() + 6 * self._scale) 307 | local icon_texture, icon_texture_rect = tweak_data.hud_icons:get_icon_or(icon, nil) 308 | if icon_texture then 309 | local icon = text_panel:bitmap({ 310 | texture = icon_texture, 311 | texture_rect = icon_texture_rect, 312 | layer = 2, 313 | x = 10 * self._scale, 314 | y = 3 * self._scale, 315 | w = self.ICON_SIZE * self._scale, 316 | h = self.ICON_SIZE * self._scale 317 | }) 318 | noti_text:set_x(icon:right() + 5) 319 | noti_text:set_h(math.max(icon:h() + 6 * self._scale, noti_text:h())) 320 | icon:set_center_y(noti_text:center_y()) 321 | end 322 | local box_height = noti_text:h() 323 | 324 | for i, reward in ipairs(rewards or {}) do 325 | local reward_panel = text_panel:panel({ 326 | h = 20, 327 | x = 25, 328 | y = noti_text:bottom() + (i - 1) * 22, 329 | layer = 2 330 | }) 331 | local reward_icon = reward_panel:bitmap({ 332 | w = 20, 333 | h = 20, 334 | texture = reward.texture 335 | }) 336 | local reward_text = managers.localization:text(reward.name_id) 337 | 338 | if reward.amount then 339 | reward_text = reward.amount .. "x " .. reward_text 340 | end 341 | local reward_text = reward_panel:text({ 342 | text = reward_text, 343 | font = tweak_data.menu.pd2_medium_font, 344 | x = reward_icon:right() + 2, 345 | layer = 2, 346 | font_size = 20 * self._scale 347 | }) 348 | local reward_text_bg = reward_panel:text({ 349 | text = reward_text:text(), 350 | font = tweak_data.menu.pd2_medium_font, 351 | color = Color.black, 352 | layer = 1, 353 | x = reward_icon:right() + 3, 354 | font_size = 20 * self._scale 355 | }) 356 | reward_text:set_center_y(reward_icon:center_y()) 357 | reward_text_bg:set_center_y(reward_icon:center_y() + 1) 358 | reward_panel:set_w(reward_text_bg:right()) 359 | 360 | box_height = math.max(box_height, reward_panel:bottom() + 8) 361 | end 362 | 363 | local weapons_texture = "guis/textures/VoidUI/hud_weapons" 364 | local text_bg_left = text_panel:bitmap({ 365 | name = "objective_text_bg_left", 366 | texture = weapons_texture, 367 | texture_rect = {26,0,43,150}, 368 | layer = 1, 369 | w = 25 * self._scale, 370 | h = noti_text:h(), 371 | alpha = 1 372 | }) 373 | local text_bg = text_panel:bitmap({ 374 | name = "text_bg", 375 | texture = weapons_texture, 376 | texture_rect = {69,0,416,150}, 377 | layer = 1, 378 | w = noti_text:right() - 25 * self._scale, 379 | h = noti_text:h(), 380 | x = text_bg_left:right(), 381 | alpha = 1 382 | }) 383 | local text_bg_right = text_panel:bitmap({ 384 | name = "text_bg_right", 385 | texture = weapons_texture, 386 | texture_rect = {485,0,43,150}, 387 | layer = 1, 388 | w = 25 * self._scale, 389 | h = noti_text:h(), 390 | alpha = 1 391 | }) 392 | text_bg_right:set_left(text_bg:right()) 393 | text_panel:set_size(text_bg_right:right(), box_height) 394 | text_panel:set_left(self._hud:w()) 395 | local title_panel = self._hud:panel({}) 396 | local title_shadow = title_panel:text({ 397 | text = utf8.to_lower(title):gsub("^%l", string.upper) or "Achievement unlocked!", 398 | x = 1, 399 | y = 1, 400 | font = tweak_data.menu.pd2_large_font, 401 | font_size = 20 * self._scale, 402 | color = Color.black 403 | }) 404 | self:make_fine_text(title_shadow) 405 | local title = title_panel:text({ 406 | layer = 2, 407 | text = title_shadow:text(), 408 | font = tweak_data.menu.pd2_large_font, 409 | font_size = 20 * self._scale 410 | }) 411 | self:make_fine_text(title) 412 | 413 | title_panel:set_size(title_shadow:right(), title_shadow:bottom()) 414 | title_panel:set_bottom(self._hud:h() / 1.5) 415 | title_panel:set_right(0) 416 | text_panel:set_top(title_panel:bottom()) 417 | 418 | title_panel:animate(callback(self, self, "_animate_show"), text_panel) 419 | end 420 | end -------------------------------------------------------------------------------- /lua/hud/HudSuspicion.lua: -------------------------------------------------------------------------------- 1 | if VoidUI.options.enable_suspicion then 2 | function HUDSuspicion:init(hud, sound_source) 3 | self._hud_panel = hud.panel 4 | self._sound_source = sound_source 5 | self._scale = VoidUI.options.suspicion_scale 6 | if self._hud_panel:child("suspicion_panel") then 7 | self._hud_panel:remove(self._hud_panel:child("suspicion_panel")) 8 | end 9 | self._suspicion_panel = self._hud_panel:panel({ 10 | visible = false, 11 | name = "suspicion_panel", 12 | valign = "center", 13 | w = 290 * self._scale, 14 | h = 25 * self._scale, 15 | layer = 1 16 | }) 17 | self._misc_panel = self._suspicion_panel:panel({name = "misc_panel"}) 18 | self._suspicion_fill_panel = self._suspicion_panel:panel({name = "suspicion_fill_panel"}) 19 | self._suspicion_panel:set_center(self._suspicion_panel:parent():w() / 2, self._suspicion_panel:parent():h() / 2 + VoidUI.options.suspicion_y) 20 | local scale = 1 21 | local suspicion_left_blue = self._suspicion_panel:bitmap({ 22 | name = "suspicion_left_blue", 23 | texture = "guis/textures/VoidUI/hud_extras", 24 | texture_rect = {400,0,-90,88}, 25 | color = Color(0,0.47,1), 26 | alpha = 1, 27 | w = 39 * self._scale, 28 | h = 20 * self._scale, 29 | layer = 4 30 | }) 31 | suspicion_left_blue:set_right(self._suspicion_panel:w() / 2 - 16 * self._scale) 32 | local suspicion_left_red = self._suspicion_panel:bitmap({ 33 | name = "suspicion_left_red", 34 | texture = "guis/textures/VoidUI/hud_extras", 35 | texture_rect = {400,0,-90,88}, 36 | color = Color(1,0.2,0), 37 | alpha = 1, 38 | w = 39 * self._scale, 39 | h = 20 * self._scale, 40 | layer = 2 41 | }) 42 | suspicion_left_red:set_right(self._suspicion_panel:w() / 2 - 16 * self._scale) 43 | local suspicion_right_blue = self._suspicion_panel:bitmap({ 44 | name = "suspicion_right_blue", 45 | texture = "guis/textures/VoidUI/hud_extras", 46 | texture_rect = {310,0,90,88}, 47 | color = Color(0,0.47,1), 48 | alpha = 1, 49 | w = 39 * self._scale, 50 | h = 20 * self._scale, 51 | layer = 4 52 | }) 53 | suspicion_right_blue:set_x(self._suspicion_panel:w() / 2 + 16 * self._scale) 54 | local suspicion_right_red = self._suspicion_panel:bitmap({ 55 | name = "suspicion_right_red", 56 | texture = "guis/textures/VoidUI/hud_extras", 57 | texture_rect = {310,0,90,88}, 58 | color = Color(1,0.2,0), 59 | alpha = 1, 60 | w = 39 * self._scale, 61 | h = 20 * self._scale, 62 | layer = 2 63 | }) 64 | suspicion_right_red:set_x(self._suspicion_panel:w() / 2 + 16 * self._scale) 65 | local suspicion_rate = self._suspicion_panel:text({ 66 | name = "suspicion_rate", 67 | text = " 0%", 68 | layer = 5, 69 | h = 20 * self._scale, 70 | color = Color(0,0.47,1), 71 | align = "center", 72 | vertical = "center", 73 | font_size = 18 * self._scale, 74 | font = "fonts/font_medium_mf", 75 | }) 76 | local suspicion_rate_shadow = self._suspicion_panel:text({ 77 | name = "suspicion_rate_shadow", 78 | text = " 0%", 79 | layer = 4, 80 | x = 1, 81 | y = 1, 82 | h = 20 * self._scale, 83 | color = Color.black, 84 | align = "center", 85 | vertical = "center", 86 | font_size = 18 * self._scale, 87 | font = "fonts/font_medium_mf", 88 | }) 89 | local left_shade = self._suspicion_panel:bitmap({ 90 | name = "left_shade", 91 | texture = "guis/textures/VoidUI/hud_extras", 92 | texture_rect = {710,0,-309,88}, 93 | layer = 6, 94 | alpha = 0.3, 95 | w = 130 * self._scale, 96 | h = 20 * self._scale, 97 | }) 98 | left_shade:set_right(self._suspicion_panel:w() / 2 - 16 * self._scale) 99 | 100 | local right_shade = self._suspicion_panel:bitmap({ 101 | name = "right_shade", 102 | texture = "guis/textures/VoidUI/hud_extras", 103 | texture_rect = {401,0,309,88}, 104 | layer = 6, 105 | alpha = 0.3, 106 | w = 130 * self._scale, 107 | h = 20 * self._scale, 108 | }) 109 | right_shade:set_x(self._suspicion_panel:w() / 2 + 16 * self._scale) 110 | 111 | local left_fill = self._suspicion_fill_panel:bitmap({ 112 | name = "left_fill", 113 | texture = "guis/textures/VoidUI/hud_extras", 114 | texture_rect = {309,0, -309,88}, 115 | layer = 3, 116 | w = 130 * self._scale, 117 | h = 20 * self._scale, 118 | }) 119 | left_fill:set_right(self._suspicion_fill_panel:w() / 2 - 16 * self._scale) 120 | local right_fill = self._suspicion_fill_panel:bitmap({ 121 | name = "right_fill", 122 | texture = "guis/textures/VoidUI/hud_extras", 123 | texture_rect = {0,0,309,88}, 124 | layer = 3, 125 | w = 130 * self._scale, 126 | h = 20 * self._scale, 127 | }) 128 | right_fill:set_x(self._suspicion_fill_panel:w() / 2 + 16 * self._scale) 129 | 130 | local left_background = self._misc_panel:bitmap({ 131 | name = "left_background", 132 | texture = "guis/textures/VoidUI/hud_extras", 133 | texture_rect = {309,0, -309,88}, 134 | alpha = 0.2, 135 | layer = 0, 136 | w = 130 * self._scale, 137 | h = 20 * self._scale, 138 | }) 139 | left_background:set_right(self._misc_panel:w() / 2 - 16 * self._scale) 140 | local right_background = self._misc_panel:bitmap({ 141 | name = "right_background", 142 | texture = "guis/textures/VoidUI/hud_extras", 143 | texture_rect = {0,0,309,88}, 144 | alpha = 0.2, 145 | layer = 0, 146 | w = 130 * self._scale, 147 | h = 20 * self._scale, 148 | }) 149 | right_background:set_x(self._misc_panel:w() / 2 + 16 * self._scale) 150 | 151 | local suspicion_detected = self._suspicion_panel:bitmap({ 152 | name = "suspicion_detected", 153 | visible = true, 154 | texture = "guis/textures/pd2/hud_stealth_exclam", 155 | alpha = 0, 156 | w = 25 * self._scale, 157 | h = 25 * self._scale, 158 | rotation = 360, 159 | valign = "center", 160 | layer = 1 161 | }) 162 | suspicion_detected:set_center(suspicion_rate:center()) 163 | self._eye_animation = nil 164 | self._suspicion_value = 0 165 | self._hud_timeout = 0 166 | end 167 | function HUDSuspicion:animate_eye() 168 | if self._eye_animation then 169 | return 170 | end 171 | self._suspicion_value = 0 172 | self._discovered = nil 173 | self._back_to_stealth = nil 174 | local animate_func = function(o, self) 175 | local wanted_value = 0 176 | local value = wanted_value 177 | local suspicion_rate = o:child("suspicion_rate") 178 | local suspicion_rate_shadow = o:child("suspicion_rate_shadow") 179 | local suspicion_detected = o:child("suspicion_detected") 180 | local suspicion_fill_panel = o:child("suspicion_fill_panel") 181 | local misc_panel = o:child("misc_panel") 182 | local animate_hide_misc = function(o) 183 | local start_alpha = o:alpha() 184 | wait(1.8) 185 | over(0.1, function(p) 186 | self._suspicion_panel:set_alpha(math.lerp(start_alpha, 0, p)) 187 | end) 188 | end 189 | local animate_show_misc = function(o) 190 | local start_alpha = o:alpha() 191 | over(0.2, function(p) 192 | self._suspicion_panel:set_alpha(math.lerp(start_alpha, 1, p)) 193 | end) 194 | end 195 | misc_panel:stop() 196 | misc_panel:animate(animate_show_misc) 197 | local color 198 | local dt 199 | local detect_me = false 200 | local time_to_end = 4 201 | while true do 202 | if not alive(o) then 203 | return 204 | end 205 | dt = coroutine.yield() 206 | self._hud_timeout = self._hud_timeout - dt 207 | if 0 > self._hud_timeout then 208 | self._back_to_stealth = true 209 | end 210 | if self._discovered then 211 | self._discovered = nil 212 | if not detect_me then 213 | detect_me = true 214 | wanted_value = 1 215 | self._suspicion_value = wanted_value 216 | self._sound_source:post_event("hud_suspicion_discovered") 217 | local animate_detect_text = function(o, suspicion_rate, suspicion_rate_shadow) 218 | local w, h = o:size() 219 | over(0.6, function(p) 220 | o:set_alpha(p) 221 | suspicion_rate:set_alpha(1 - p) 222 | suspicion_rate_shadow:set_alpha(1 - p) 223 | o:set_size(w * p, h * p) 224 | o:set_center(o:parent():w() / 2, o:parent():h() / 2) 225 | end) 226 | end 227 | suspicion_detected:stop() 228 | suspicion_detected:animate(animate_detect_text, suspicion_rate, suspicion_rate_shadow) 229 | end 230 | end 231 | if not detect_me and wanted_value ~= self._suspicion_value then 232 | wanted_value = self._suspicion_value 233 | end 234 | if (not detect_me or time_to_end < 2) and self._back_to_stealth then 235 | self._back_to_stealth = nil 236 | suspicion_rate:set_alpha(1) 237 | suspicion_rate_shadow:set_alpha(1) 238 | suspicion_detected:set_alpha(0) 239 | detect_me = false 240 | wanted_value = 0 241 | self._suspicion_value = wanted_value 242 | misc_panel:stop() 243 | misc_panel:animate(animate_hide_misc) 244 | end 245 | value = math.lerp(value, wanted_value, 0.2) 246 | if math.abs(value - wanted_value) < 0.01 then 247 | value = wanted_value 248 | end 249 | suspicion_rate:set_text(math.floor(value * 100) .."%") 250 | suspicion_rate_shadow:set_text(suspicion_rate:text()) 251 | self:align_suspicion(value) 252 | suspicion_rate:set_color(math.lerp(Color(0,0.47,1), Color(1,0.2,0), math.clamp(value - 0.30, 0, 0.4) / 0.4)) 253 | 254 | local misc_panel = o:child("misc_panel") 255 | if value == 1 then 256 | time_to_end = time_to_end - dt 257 | if time_to_end <= 0 then 258 | self._eye_animation = nil 259 | self:hide() 260 | return 261 | end 262 | elseif value <= 0 then 263 | time_to_end = time_to_end - dt * 2 264 | if time_to_end <= 0 then 265 | self._eye_animation = nil 266 | self:hide() 267 | return 268 | end 269 | elseif time_to_end ~= 4 then 270 | time_to_end = 4 271 | misc_panel:stop() 272 | misc_panel:animate(animate_show_misc) 273 | end 274 | end 275 | end 276 | self._sound_source:post_event("hud_suspicion_start") 277 | self._eye_animation = self._suspicion_panel:animate(animate_func, self) 278 | end 279 | function HUDSuspicion:align_suspicion(value) 280 | local left_fill = self._suspicion_fill_panel:child("left_fill") 281 | local right_fill = self._suspicion_fill_panel:child("right_fill") 282 | local left_background = self._misc_panel:child("left_background") 283 | local right_background = self._misc_panel:child("right_background") 284 | 285 | local suspicion_left_blue = self._suspicion_panel:child("suspicion_left_blue") 286 | local suspicion_left_red = self._suspicion_panel:child("suspicion_left_red") 287 | local suspicion_right_blue = self._suspicion_panel:child("suspicion_right_blue") 288 | local suspicion_right_red = self._suspicion_panel:child("suspicion_right_red") 289 | self._suspicion_panel:set_center_y(self._suspicion_panel:parent():h() / 2 + VoidUI.options.suspicion_y) 290 | suspicion_right_red:set_x(math.lerp(right_background:x(), right_background:right() - suspicion_right_red:w(), value)) 291 | suspicion_right_blue:set_x(math.min(suspicion_right_red:x(), right_background:x() + (right_background:w() / 2.35) - suspicion_right_blue:w() / 2)) 292 | suspicion_left_red:set_x(math.lerp(left_background:right() - suspicion_left_red:w(), left_background:x(), value)) 293 | suspicion_left_blue:set_x(math.max(suspicion_left_red:x(), left_background:x() + left_background:w() / 2.3)) 294 | 295 | self._suspicion_fill_panel:set_w(suspicion_right_red:center_x() - suspicion_left_red:center_x()) 296 | self._suspicion_fill_panel:set_center_x(self._misc_panel:center_x()) 297 | 298 | left_fill:set_right(self._suspicion_fill_panel:w() / 2 - 16 * self._scale) 299 | right_fill:set_x(self._suspicion_fill_panel:w() / 2 + 16 * self._scale) 300 | end 301 | function HUDSuspicion:hide() 302 | if self._eye_animation then 303 | self._eye_animation:stop() 304 | self._eye_animation = nil 305 | self._sound_source:post_event("hud_suspicion_end") 306 | end 307 | self._suspicion_value = 0 308 | self._discovered = nil 309 | self._back_to_stealth = nil 310 | if alive(self._misc_panel) then 311 | self._misc_panel:stop() 312 | end 313 | if alive(self._suspicion_panel) then 314 | self._suspicion_panel:set_visible(false) 315 | self._suspicion_panel:child("suspicion_rate"):set_alpha(1) 316 | self._suspicion_panel:child("suspicion_rate_shadow"):set_alpha(1) 317 | self._suspicion_panel:child("suspicion_detected"):stop() 318 | self._suspicion_panel:child("suspicion_detected"):set_alpha(0) 319 | end 320 | end 321 | end -------------------------------------------------------------------------------- /lua/hud/HudTemp.lua: -------------------------------------------------------------------------------- 1 | if VoidUI.options.teammate_panels then 2 | local init = HUDTemp.init 3 | function HUDTemp:init(hud) 4 | self._hud_panel = hud.panel 5 | if self._hud_panel:child("custom_temp_panel") then 6 | self._hud_panel:remove(self._hud_panel:child("custom_temp_panel")) 7 | end 8 | self._scale = VoidUI.options.hud_main_scale 9 | self._custom_temp_panel = self._hud_panel:panel({ 10 | visible = true, 11 | name = "custom_temp_panel", 12 | y = 0, 13 | valign = "scale", 14 | layer = 0 15 | }) 16 | local bag_panel = self._custom_temp_panel:panel({ 17 | visible = false, 18 | name = "bag_panel", 19 | halign = "right", 20 | valign = "bottom", 21 | layer = 10, 22 | w = 200, 23 | h = 56 24 | }) 25 | 26 | local bag_icon = bag_panel:bitmap({ 27 | name = "bag_icon", 28 | texture = "guis/textures/pd2/hud_tabs", 29 | w = 25, 30 | h = 25, 31 | texture_rect = {32, 33, 32, 31}, 32 | visible = true, 33 | layer = 2, 34 | rotation = 360, 35 | color = Color.white, 36 | }) 37 | local bag_text_panel = bag_panel:panel({ 38 | name = "bag_text_panel", 39 | halign = "center", 40 | valign = "center", 41 | layer = 1, 42 | }) 43 | 44 | local bag_text = bag_text_panel:text({ 45 | name = "bag_text", 46 | text = "Jewlery", 47 | vertical = "center", 48 | align = "right", 49 | layer = 1, 50 | font = "fonts/font_medium_mf", 51 | font_size = 25 52 | }) 53 | local bag_text_bg = bag_text_panel:text({ 54 | name = "bag_text_bg", 55 | text = "Jewlery", 56 | vertical = "center", 57 | align = "right", 58 | layer = 0, 59 | x = 1, 60 | y = 1, 61 | color = Color.black, 62 | font = "fonts/font_medium_mf", 63 | font_size = 25 64 | }) 65 | self._bag_panel_w = bag_panel:w() 66 | self._bag_panel_h = bag_panel:h() 67 | bag_panel:set_right(self._custom_temp_panel:w()) 68 | bag_panel:set_bottom(self:_bag_panel_bottom()) 69 | 70 | init(self, hud) 71 | end 72 | function HUDTemp:_bag_panel_bottom() 73 | return self._custom_temp_panel:h() - managers.hud._teammate_panels[HUDManager.PLAYER_PANEL]._bg_h - (25 * math.clamp(self._scale, 0.65 , 1)) 74 | end 75 | function HUDTemp:show_carry_bag(carry_id, value) 76 | local bag_panel = self._custom_temp_panel:child("bag_panel") 77 | local carry_data = tweak_data.carry[carry_id] 78 | local type_text = carry_data.name_id and managers.localization:text(carry_data.name_id) 79 | local bag_text_panel = bag_panel:child("bag_text_panel") 80 | local bag_text = bag_text_panel:child("bag_text") 81 | local bag_text_bg = bag_text_panel:child("bag_text_bg") 82 | local bag_icon = bag_panel:child("bag_icon") 83 | bag_text:set_font_size(25) 84 | bag_text_bg:set_font_size(25) 85 | bag_text:set_text(type_text) 86 | bag_text_bg:set_text(type_text) 87 | local x,_,w,h = bag_text:text_rect() 88 | bag_text_panel:set_size(w, h * 2) 89 | bag_text:set_size(w, h * 2) 90 | bag_text_bg:set_size(w, h * 2) 91 | bag_text_panel:set_x(bag_panel:w() / 2 - w / 2) 92 | bag_icon:set_center(bag_text_panel:center()) 93 | 94 | bag_panel:set_visible(true) 95 | bag_panel:stop() 96 | bag_panel:animate(callback(self, self, "_animate_show_bag_panel")) 97 | end 98 | function HUDTemp:hide_carry_bag() 99 | local bag_panel = self._custom_temp_panel:child("bag_panel") 100 | bag_panel:stop() 101 | bag_panel:animate(callback(self, self, "_animate_hide_bag_panel")) 102 | end 103 | function HUDTemp:_animate_hide_bag_panel(bag_panel) 104 | local bag_text_panel = bag_panel:child("bag_text_panel") 105 | local bag_text = bag_text_panel:child("bag_text") 106 | local bag_text_bg = bag_text_panel:child("bag_text_bg") 107 | local bag_icon = bag_panel:child("bag_icon") 108 | bag_text_panel:stop() 109 | bag_text_panel:animate(callback(self, self, "_animate_hide_text"), bag_text, bag_text_bg, bag_icon) 110 | wait(1) 111 | bag_panel:set_visible(false) 112 | end 113 | function HUDTemp:_animate_show_bag_panel(bag_panel) 114 | local w, h = self._bag_panel_w, self._bag_panel_h 115 | local scx = self._custom_temp_panel:w() / 2 116 | local ecx = self._custom_temp_panel:w() - w / 2 117 | local scy = self._custom_temp_panel:h() / 1.8 118 | local ecy = self:_bag_panel_bottom() - (bag_panel:h() / 2) 119 | local bottom = bag_panel:bottom() 120 | local center_y = bag_panel:center_y() 121 | local bag_text_panel = bag_panel:child("bag_text_panel") 122 | local bag_text = bag_text_panel:child("bag_text") 123 | local bag_text_bg = bag_text_panel:child("bag_text_bg") 124 | local bag_icon = bag_panel:child("bag_icon") 125 | bag_text_panel:stop() 126 | bag_text_panel:set_visible(true) 127 | bag_text_panel:animate(callback(self, self, "_animate_show_text"), bag_text, bag_text_bg, bag_icon) 128 | 129 | bag_panel:set_size(w, h + 2) 130 | bag_panel:set_center_x(scx) 131 | bag_panel:set_center_y(scy) 132 | wait(1.5) 133 | local TOTAL_T = 0.5 134 | local t = 0 135 | local x = bag_icon:x() 136 | local y = bag_icon:y() 137 | while t < TOTAL_T do 138 | local dt = coroutine.yield() 139 | t = t + dt 140 | bag_panel:set_center_x(math.lerp(scx, ecx, t / TOTAL_T)) 141 | bag_panel:set_center_y(math.lerp(scy, ecy, t / TOTAL_T)) 142 | bag_icon:set_x(math.lerp(x, bag_panel:w() - bag_icon:w(), t / TOTAL_T)) 143 | bag_icon:set_y(math.lerp(y, bag_panel:h() - bag_icon:h(), t / TOTAL_T)) 144 | bag_text:set_font_size(math.lerp(25, 20, t / TOTAL_T)) 145 | bag_text_bg:set_font_size(math.lerp(25, 20, t / TOTAL_T)) 146 | bag_text_panel:set_right(bag_icon:left()) 147 | bag_text_panel:set_center_y(bag_icon:center_y()) 148 | end 149 | bag_panel:set_size(w, h) 150 | bag_panel:set_center_x(ecx) 151 | bag_panel:set_center_y(ecy) 152 | end 153 | function HUDTemp:_animate_show_text(panel, text, bg, icon) 154 | 155 | text:set_left(panel:right()) 156 | bg:set_left(panel:right() + 1) 157 | local text_x = text:x() 158 | icon:set_alpha(1) 159 | 160 | local TOTAL_T = 0.2 161 | local t = 0 162 | while TOTAL_T > t do 163 | local dt = coroutine.yield() 164 | t = t + dt 165 | icon:set_size(math.lerp(0, 40, t / TOTAL_T), math.lerp(0, 40, t / TOTAL_T)) 166 | icon:set_center(panel:center()) 167 | end 168 | 169 | local x = icon:x() 170 | local right = panel:right() 171 | local center_y = panel:center_y() 172 | panel:set_w(panel:w() * 2) 173 | text:set_w(text:w() * 2) 174 | bg:set_w(text:w()) 175 | TOTAL_T = 0.5 176 | t = 0 177 | while TOTAL_T > t do 178 | local dt = coroutine.yield() 179 | t = t + dt 180 | icon:set_x(math.lerp(x, right, t / TOTAL_T)) 181 | icon:set_center_y(center_y) 182 | icon:set_size(math.lerp(40, 25, t / TOTAL_T), math.lerp(40, 25, t / TOTAL_T)) 183 | panel:set_right(icon:left()) 184 | text:set_x(math.lerp(text_x, 1, t / TOTAL_T)) 185 | bg:set_x(math.lerp(text_x + 1, 2, t / TOTAL_T)) 186 | end 187 | text:set_x(0) 188 | bg:set_x(1) 189 | text:set_alpha(1) 190 | bg:set_alpha(1) 191 | end 192 | function HUDTemp:_animate_hide_text(panel, text, bg, icon) 193 | local TOTAL_T = 0.5 194 | local t = 0 195 | while TOTAL_T > t do 196 | local dt = coroutine.yield() 197 | t = t + dt 198 | text:set_x(math.lerp(0, panel:w(), t / TOTAL_T)) 199 | bg:set_x(math.lerp(1, panel:w() + 1, t / TOTAL_T)) 200 | end 201 | 202 | TOTAL_T = 0.3 203 | t = 0 204 | local w = icon:w() 205 | local center_x = icon:center_x() 206 | local center_y = icon:center_y() 207 | local icon_a = icon:alpha() 208 | TOTAL_T = 0.2 209 | while TOTAL_T > t do 210 | local dt = coroutine.yield() 211 | t = t + dt 212 | icon:set_alpha(math.lerp(icon_a, 0, t / TOTAL_T)) 213 | icon:set_size(math.lerp(w, 0, t / TOTAL_T), math.lerp(w, 0, t / TOTAL_T)) 214 | icon:set_center_x(center_x) 215 | icon:set_center_y(center_y) 216 | end 217 | text:set_alpha(1) 218 | text:set_font_size(25) 219 | bg:set_alpha(1) 220 | bg:set_font_size(25) 221 | end 222 | end -------------------------------------------------------------------------------- /lua/hud/HudVoice.lua: -------------------------------------------------------------------------------- 1 | if VoidUI.options.enable_voice then 2 | if RequiredScript == "lib/managers/hudmanagerpd2" then 3 | HUDVoice = HUDVoice or class() 4 | 5 | function HUDVoice:init(hud) 6 | self._hud_panel = hud.panel 7 | if self._hud_panel:child("voice_chat_panel") then 8 | self._hud_panel:remove(self._hud_panel:child("voice_chat_panel")) 9 | end 10 | self._speakers = {} 11 | self._main_scale = VoidUI.options.hud_main_scale 12 | self._scale = VoidUI.options.voice_scale 13 | self._voice_panel = self._hud_panel:panel({name = "voice_chat_panel"}) 14 | end 15 | 16 | function HUDVoice:set_voice(data, active) 17 | self._scale = VoidUI.options.voice_scale 18 | if active then 19 | local name = managers.network:session():peer(data.peer_id):name() 20 | local color = tweak_data.chat_colors[data.peer_id] or Color.white 21 | local panel = self:add_panel(data.peer_id, name, color) 22 | else 23 | self:remove_panel(data.peer_id) 24 | end 25 | end 26 | function HUDVoice:remove_panel(id) 27 | local panel 28 | for j, k in ipairs(self._speakers) do 29 | if k.id == id then 30 | panel = j 31 | end 32 | end 33 | if panel then 34 | self._voice_panel:remove(self._speakers[panel].panel) 35 | table.remove(self._speakers, panel) 36 | end 37 | self:align_panels() 38 | end 39 | function HUDVoice:add_panel(id, name, color) 40 | if self._voice_panel:child("voice_"..id) then 41 | return self._voice_panel:child("voice_"..id) 42 | end 43 | local panel = self._voice_panel:panel({name = "voice_"..id}) 44 | local text = panel:text({ 45 | layer = 1, 46 | font_size = 20 * self._scale, 47 | font = "fonts/font_medium_mf", 48 | text = VoidUI.options.voice_name and tostring(name) or " ", 49 | color = color 50 | }) 51 | local text_bg = panel:text({ 52 | x = 1, 53 | y = 1, 54 | layer = 0, 55 | font_size = 20 * self._scale, 56 | font = "fonts/font_medium_mf", 57 | text = text:text(), 58 | color = Color.black 59 | }) 60 | managers.hud:make_fine_text(text) 61 | managers.hud:make_fine_text(text_bg) 62 | local image = panel:bitmap({ 63 | x = text:right() + 2, 64 | texture = "guis/textures/VoidUI/hud_extras", 65 | texture_rect = {834,0,40,40}, 66 | w = text:h(), 67 | h = text:h(), 68 | color = color 69 | }) 70 | panel:set_size(image:right(), image:bottom()) 71 | panel:set_right(self._hud_panel:w() - (220 * self._main_scale)) 72 | 73 | table.insert(self._speakers, {id = id, panel = panel}) 74 | self:align_panels() 75 | return panel 76 | end 77 | 78 | function HUDVoice:align_panels() 79 | for j, k in ipairs(self._speakers) do 80 | k.panel:set_bottom(self._hud_panel:h() - ((j-1) * 22 * self._main_scale)) 81 | end 82 | end 83 | elseif RequiredScript == "lib/network/matchmaking/networkvoicechatsteam" then 84 | Hooks:PostHook(NetworkVoiceChatSTEAM, "set_recording", "set_player_voice", function(self, enabled) 85 | if managers.hud and (self._voice_enabled == nil or self._voice_enabled ~= enabled) and managers.network and managers.network.session and managers.network:session():local_peer() and managers.network:session():local_peer():id() and SystemInfo:distribution() == Idstring("STEAM") then 86 | self._voice_enabled = enabled 87 | managers.hud:set_voice({peer_id = managers.network:session():local_peer():id()}, enabled) 88 | end 89 | end) 90 | end 91 | end -------------------------------------------------------------------------------- /lua/managers/Jokers.lua: -------------------------------------------------------------------------------- 1 | if RequiredScript == "lib/units/contourext" then 2 | table.insert(ContourExt._types, "joker") 3 | ContourExt._types["joker"] = {priority = 1, material_swap_required = true} 4 | 5 | elseif RequiredScript == "lib/managers/group_ai_states/groupaistatebase" then 6 | 7 | Hooks:PostHook(GroupAIStateBase,"convert_hostage_to_criminal","void_convert_hostage_to_criminal", function(self, unit, peer_unit) 8 | if alive(unit) then 9 | local player_unit = peer_unit or managers.player:player_unit() 10 | local unit_data = self._police[unit:key()] 11 | local color_id = managers.criminals:character_color_id_by_unit(player_unit) 12 | if VoidUI.options.outlines then 13 | unit:contour():add("joker", nil, 1) 14 | unit:contour():change_color("joker", tweak_data.peer_vector_colors[color_id]) 15 | end 16 | 17 | if unit_data and VoidUI.options.enable_labels and VoidUI.options.label_jokers then 18 | local panel_id = managers.hud:_add_name_label({unit = unit, name = "Joker", owner_unit = player_unit}) 19 | local label = managers.hud:_get_name_label(panel_id) 20 | if VoidUI.options.health_jokers and VoidUI.options.enable_labels and label.panel:child("minmode_panel") then 21 | label.interact:set_visible(true) 22 | label.interact_bg:set_visible(true) 23 | label.panel:child("minmode_panel"):child("min_interact"):set_visible(true) 24 | label.panel:child("minmode_panel"):child("min_interact_bg"):set_visible(true) 25 | label.interact:set_w(label.interact_bg:w()) 26 | end 27 | unit:unit_data().label_id = panel_id 28 | end 29 | unit:base().owner_peer_id = player_unit:network():peer():id() 30 | end 31 | end) 32 | 33 | Hooks:PreHook(GroupAIStateBase,"remove_minion","void_remove_minion", function(self, minion_key, player_key) 34 | local minion_unit = self._converted_police[minion_key] 35 | if alive(minion_unit) then 36 | if minion_unit.unit_data and minion_unit:unit_data().label_id then 37 | managers.hud:_remove_name_label(minion_unit:unit_data().label_id) 38 | end 39 | minion_unit:contour():remove("joker") 40 | end 41 | end) 42 | 43 | elseif RequiredScript == "lib/network/handlers/unitnetworkhandler" then 44 | Hooks:PostHook(UnitNetworkHandler,"mark_minion","void_mark_minion", function(self, unit, minion_owner_peer_id, convert_enemies_health_multiplier_level, passive_convert_enemies_health_multiplier_level, sender) 45 | if alive(unit) and minion_owner_peer_id and managers.network and managers.network:session() then 46 | local get_owner = managers.network:session():peer(minion_owner_peer_id):unit() 47 | local color_id = minion_owner_peer_id and managers.criminals and managers.criminals:character_color_id_by_unit(get_owner) or 1 48 | if VoidUI.options.outlines then 49 | unit:contour():add("joker", nil, 1) 50 | unit:contour():change_color("joker", tweak_data.peer_vector_colors[color_id]) 51 | end 52 | 53 | if VoidUI.options.enable_labels and VoidUI.options.label_jokers then 54 | local panel_id = managers.hud:_add_name_label({ unit = unit, name = "Joker", owner_unit = managers.network:session():peer(minion_owner_peer_id):unit()}) 55 | local label = managers.hud:_get_name_label(panel_id) 56 | if VoidUI.options.health_jokers and VoidUI.options.enable_labels and label.panel:child("minmode_panel") then 57 | label.interact:set_visible(true) 58 | label.interact_bg:set_visible(true) 59 | label.panel:child("minmode_panel"):child("min_interact"):set_visible(true) 60 | label.panel:child("minmode_panel"):child("min_interact_bg"):set_visible(true) 61 | label.interact:set_w(label.interact_bg:w()) 62 | end 63 | unit:unit_data().label_id = panel_id 64 | end 65 | unit:base().owner_peer_id = minion_owner_peer_id 66 | end 67 | end) 68 | 69 | Hooks:PreHook(UnitNetworkHandler,"hostage_trade","void_hostage_trade", function(self, unit, enable, trade_success, skip_hint) 70 | if alive(unit) then 71 | if unit.unit_data and unit:unit_data().label_id then 72 | managers.hud:_remove_name_label(unit:unit_data().label_id) 73 | unit:unit_data().label_id = nil 74 | end 75 | unit:contour():remove("joker") 76 | end 77 | end) 78 | elseif RequiredScript == "lib/units/enemies/cop/huskcopbrain" then 79 | 80 | Hooks:PreHook(HuskCopBrain,"clbk_death","void_cop_clbk_death", function(self, my_unit, damage_info) 81 | if alive(self._unit) then 82 | if self._unit:unit_data().label_id then 83 | managers.hud:_remove_name_label(self._unit:unit_data().label_id) 84 | self._unit:unit_data().label_id = nil 85 | end 86 | self._unit:contour():remove("joker") 87 | end 88 | end) 89 | 90 | elseif RequiredScript == "lib/units/enemies/cop/copdamage" and VoidUI.options.enable_labels then 91 | 92 | Hooks:PostHook(CopDamage,"_on_damage_received","void_cop_on_damage_received", function(self, damage_info) 93 | if alive(self._unit) and self._unit:unit_data().label_id then 94 | local label = managers.hud:_get_name_label(self._unit:unit_data().label_id) 95 | if label then 96 | label.interact:set_visible(VoidUI.options.health_jokers) 97 | label.interact_bg:set_visible(VoidUI.options.health_jokers) 98 | label.panel:child("minmode_panel"):child("min_interact"):set_visible(VoidUI.options.health_jokers) 99 | label.panel:child("minmode_panel"):child("min_interact_bg"):set_visible(VoidUI.options.health_jokers) 100 | label.interact:set_w(label.interact_bg:w() * self._health_ratio) 101 | label.panel:child("minmode_panel"):child("min_interact"):set_w(label.panel:child("minmode_panel"):child("min_interact_bg"):w() * self._health_ratio) 102 | end 103 | end 104 | end) 105 | 106 | end -------------------------------------------------------------------------------- /lua/menu/LevelLoadingScreen.lua: -------------------------------------------------------------------------------- 1 | local function make_fine_text(text_obj) 2 | local x, y, w, h = text_obj:text_rect() 3 | 4 | text_obj:set_size(w, h) 5 | text_obj:set_position(math.round(text_obj:x()), math.round(text_obj:y())) 6 | end 7 | if RequiredScript == "lib/utils/levelloadingscreenguiscript" then 8 | 9 | local init = LevelLoadingScreenGuiScript.init 10 | function LevelLoadingScreenGuiScript:init(scene_gui, res, progress, base_layer) 11 | if base_layer ~= 1001 then 12 | return init(self, scene_gui, res, progress, base_layer) 13 | end 14 | self._scene_gui = scene_gui 15 | self._res = res 16 | self._base_layer = base_layer 17 | self._level_tweak_data = arg.load_level_data.level_tweak_data 18 | self._gui_tweak_data = arg.load_level_data.gui_tweak_data 19 | self._menu_tweak_data = arg.load_level_data.menu_tweak_data 20 | self._scale_tweak_data = arg.load_level_data.scale_tweak_data 21 | self._gui_data = arg.load_level_data.gui_data 22 | self._workspace_size = self._gui_data.workspace_size 23 | self._saferect_size = self._gui_data.saferect_size 24 | local challenges = arg.load_level_data.challenges 25 | local safe_rect_pixels = self._gui_data.safe_rect_pixels 26 | local safe_rect = self._gui_data.safe_rect 27 | local aspect_ratio = self._gui_data.aspect_ratio 28 | self._safe_rect_pixels = safe_rect_pixels 29 | self._safe_rect = safe_rect 30 | self._gui_data_manager = GuiDataManager:new(self._scene_gui, res, safe_rect_pixels, safe_rect, aspect_ratio) 31 | self._back_drop_gui = MenuBackdropGUI:new(nil, self._gui_data_manager, true) 32 | 33 | local base_panel = self._back_drop_gui:get_new_base_layer() 34 | self._base = base_panel 35 | self._back_drop_gui:enable_light(false) 36 | local level_image = base_panel:bitmap({ 37 | texture = self._gui_data.bg_texture, 38 | color = Color(0.5,0.5,0.5) 39 | }) 40 | level_image:set_size(level_image:parent():h() * level_image:texture_width() / level_image:texture_height(), level_image:parent():h()) 41 | level_image:set_position(0, -20) 42 | 43 | local background_fullpanel = self._back_drop_gui:get_new_background_layer() 44 | local background_safepanel = self._back_drop_gui:get_new_background_layer() 45 | self._back_drop_gui:set_panel_to_saferect(background_safepanel) 46 | 47 | if arg.load_level_data.tip then 48 | self._loading_hint = self:_make_loading_hint(background_safepanel, arg.load_level_data.tip) 49 | end 50 | 51 | self._fade = background_fullpanel:gradient({ 52 | layer = 0, 53 | orientation = "vertical", 54 | gradient_points = { 55 | 0, 56 | Color.black:with_alpha(1), 57 | 0.05, 58 | Color.black:with_alpha(1), 59 | 0.25, 60 | Color.black:with_alpha(0), 61 | 0.75, 62 | Color.black:with_alpha(0), 63 | 0.95, 64 | Color.black:with_alpha(1), 65 | 1, 66 | Color.black:with_alpha(1) 67 | }, 68 | }) 69 | local black_shader = background_fullpanel:bitmap({ 70 | name = "black_shader", 71 | layer = 19, 72 | color = Color.black 73 | }) 74 | local extras = "guis/textures/VoidUI/hud_extras" 75 | self._indicator = background_safepanel:bitmap({ 76 | texture = extras, 77 | name = "indicator", 78 | texture_rect = { 79 | 875, 80 | 0, 81 | 55, 82 | 54 83 | }, 84 | layer = 20 85 | }) 86 | self._logo = background_safepanel:bitmap({ 87 | texture = extras, 88 | name = "logo", 89 | texture_rect = { 90 | 933, 91 | 4, 92 | 37, 93 | 37 94 | }, 95 | layer = 21 96 | }) 97 | self._level_title_text = background_safepanel:text({ 98 | y = 0, 99 | vertical = "center", 100 | h = 35, 101 | text_id = "debug_loading_level", 102 | font_size = 30, 103 | align = "left", 104 | font = "fonts/font_large_mf", 105 | layer = 20, 106 | color = Color.white 107 | }) 108 | 109 | self._level_title_text:set_text(utf8.to_upper(self._level_title_text:text())) 110 | make_fine_text(self._level_title_text) 111 | self._indicator:set_rightbottom(self._indicator:parent():w(), self._indicator:parent():h()) 112 | self._logo:set_center(self._indicator:center()) 113 | self._level_title_text:set_right(self._indicator:left()) 114 | self._level_title_text:set_center_y(self._indicator:center_y() + 2) 115 | 116 | local level_name = self._level_tweak_data.contractor and string.format("%1s: %2s", utf8.to_upper(self._level_tweak_data.contractor), utf8.to_upper(self._level_tweak_data.level or self._level_tweak_data.name_id)) or "" 117 | local level_text = background_safepanel:text({ 118 | h = 45, 119 | text = level_name, 120 | font_size = 35, 121 | font = "fonts/font_large_mf", 122 | layer = 5, 123 | color = Color.white 124 | }) 125 | make_fine_text(level_text) 126 | level_text:set_center_x(level_text:parent():w() / 2) 127 | local level_briefing = background_safepanel:text({ 128 | text = self._level_tweak_data.briefing, 129 | font_size = 15, 130 | width = 300, 131 | align = "right", 132 | wrap = true, 133 | font = "fonts/font_small_mf", 134 | layer = 5, 135 | }) 136 | level_briefing:set_right(level_briefing:parent():w()) 137 | local tweak_risk = self._level_tweak_data.risk 138 | if tweak_risk then 139 | local risk_panel = background_safepanel:panel() 140 | local risk_level = utf8.to_upper(tweak_risk.name or "") 141 | local risk_text = risk_panel:text({ 142 | text = risk_level, 143 | font_size = 25, 144 | y = 2, 145 | font = "fonts/font_large_mf", 146 | layer = 5, 147 | color = tweak_risk.color or Color.white 148 | }) 149 | make_fine_text(risk_text) 150 | local current_dif = tweak_risk.current 151 | if tweak_risk.difficulties then 152 | for i = 1, #tweak_risk.difficulties - 2 do 153 | local difficulty_name = tweak_risk.difficulties[i + 2] 154 | local texture = tweak_risk.risk_textures[difficulty_name] or "guis/textures/pd2/risklevel_blackscreen" 155 | last_risk_level = risk_panel:bitmap({ 156 | texture = texture, 157 | color = tweak_risk.color or Color.white, 158 | w = 25, 159 | h = 25 160 | }) 161 | last_risk_level:set_color(i <= current_dif and tweak_risk.color or Color.white) 162 | last_risk_level:set_alpha(i <= current_dif and 1 or 0.20) 163 | last_risk_level:move(risk_text:w() + (i - 1) * last_risk_level:w(), 0) 164 | end 165 | if last_risk_level then 166 | risk_panel:set_size(last_risk_level:right(), last_risk_level:bottom()) 167 | end 168 | else 169 | risk_panel:set_size(risk_text:right(), risk_text:bottom()) 170 | end 171 | risk_panel:set_center_x(level_text:center_x()) 172 | risk_panel:set_top(level_text:bottom()) 173 | end 174 | local days = self._level_tweak_data.days 175 | if days ~= "" then 176 | background_safepanel:text({ 177 | text = utf8.to_upper(days), 178 | font_size = 20, 179 | font = "fonts/font_medium_mf", 180 | layer = 5, 181 | }) 182 | end 183 | local peer_names = self._level_tweak_data.peers 184 | if peer_names then 185 | local peer_names_count = #peer_names 186 | local additional_players = self._level_tweak_data.additional_players 187 | local player_count = self._level_tweak_data.player_count 188 | for id, peer in pairs(peer_names) do 189 | background_safepanel:text({ 190 | text = peer.name or "", 191 | font_size = 18, 192 | y = (id - (days ~= "" and 0 or 1)) * 16 + 2, 193 | font = "fonts/font_medium_mf", 194 | layer = 5, 195 | color = self._level_tweak_data.chat_colors[peer.id] 196 | }) 197 | end 198 | if player_count ~= peer_names_count then 199 | background_safepanel:text({ 200 | text = additional_players, 201 | font_size = 15, 202 | y = (peer_names_count + (days ~= "" and 1 or 0)) * 16 + 2, 203 | font = "fonts/font_medium_mf", 204 | layer = 5, 205 | color = self._level_tweak_data.chat_colors[#self._level_tweak_data.chat_colors or 5] 206 | }) 207 | end 208 | end 209 | black_shader:animate(callback(self, self, "_animate_fade")) 210 | end 211 | function LevelLoadingScreenGuiScript:_animate_fade(shader) 212 | shader:set_alpha(1) 213 | wait(0.2) 214 | local t = 0 215 | local TOTAL_T = 0.5 216 | while TOTAL_T > t do 217 | local dt = coroutine.yield() 218 | t = t + dt 219 | shader:set_alpha(math.lerp(1, 0, t / TOTAL_T)) 220 | end 221 | shader:set_alpha(0) 222 | end 223 | 224 | local make_loading_hint = LevelLoadingScreenGuiScript._make_loading_hint 225 | function LevelLoadingScreenGuiScript:_make_loading_hint(parent, tip) 226 | if self._base_layer ~= 1001 then 227 | return make_loading_hint(self, parent, tip) 228 | end 229 | 230 | local container = parent:panel({h = 145}) 231 | local hint_text_width = 450 232 | local font = "fonts/font_medium_mf" 233 | local font_size = 20 234 | local hint_image = container:bitmap({ 235 | height = 128, 236 | width = 128, 237 | texture = "guis/textures/loading/hints/" .. tip.image 238 | }) 239 | hint_image:set_bottom(container:h()) 240 | local hint_title = container:text({ 241 | text = string.format("%1s #%d / %d", tip.title, tip.index, tip.total), 242 | x = 22, 243 | font = font, 244 | font_size = font_size, 245 | color = Color.white 246 | }) 247 | local hint_box = container:panel({y = 10, h = 128}) 248 | hint_box:set_bottom(container:h() - 6) 249 | local hint_text = hint_box:text({ 250 | wrap = true, 251 | word_wrap = true, 252 | x = 128, 253 | vertical = "center", 254 | text = tip.text, 255 | font = font, 256 | font_size = font_size, 257 | color = Color.white, 258 | width = hint_text_width 259 | }) 260 | 261 | make_fine_text(hint_title) 262 | hint_box:set_width(hint_text_width + 187 + 16) 263 | container:set_bottom(parent:height()) 264 | 265 | return container 266 | end 267 | function LevelLoadingScreenGuiScript:update(progress, t, dt) 268 | if self._base_layer == 1001 then 269 | self._indicator:set_alpha(math.abs(math.sin(60 * t))) 270 | else 271 | self._indicator:rotate(180 * dt) 272 | end 273 | end 274 | elseif RequiredScript == "lib/utils/lightloadingscreenguiscript" then 275 | 276 | local init_light = LightLoadingScreenGuiScript.init 277 | function LightLoadingScreenGuiScript:init(scene_gui, res, progress, base_layer, is_win32) 278 | if base_layer ~= 1001 then 279 | return init_light(self, scene_gui, res, progress, base_layer, is_win32) 280 | end 281 | self._base_layer = base_layer 282 | self._is_win32 = is_win32 283 | self._scene_gui = scene_gui 284 | self._res = res 285 | self._ws = scene_gui:create_screen_workspace() 286 | self._safe_rect_pixels = self:get_safe_rect_pixels(res) 287 | self._saferect = self._scene_gui:create_screen_workspace() 288 | 289 | self:layout_saferect() 290 | 291 | local panel = self._ws:panel() 292 | self._panel = panel 293 | self._bg_gui = panel:rect({ 294 | visible = true, 295 | color = Color.black, 296 | layer = base_layer 297 | }) 298 | self._saferect_panel = self._saferect:panel() 299 | self._gui_tweak_data = { 300 | upper_saferect_border = 64, 301 | border_pad = 8 302 | } 303 | self._title_text = self._saferect_panel:text({ 304 | y = 0, 305 | h = 24, 306 | text_id = "debug_loading_level", 307 | font_size = 30, 308 | align = "left", 309 | font = "fonts/font_large_mf", 310 | halign = "left", 311 | color = Color.white, 312 | layer = self._base_layer + 1 313 | }) 314 | self._title_text:set_text(string.upper(self._title_text:text())) 315 | 316 | local extras = "guis/textures/VoidUI/hud_extras" 317 | self._indicator = self._saferect_panel:bitmap({ 318 | texture = extras, 319 | name = "indicator", 320 | texture_rect = { 321 | 875, 322 | 0, 323 | 55, 324 | 54 325 | }, 326 | layer = self._base_layer + 1 327 | }) 328 | self._logo = self._saferect_panel:bitmap({ 329 | texture = extras, 330 | name = "logo", 331 | texture_rect = { 332 | 933, 333 | 4, 334 | 37, 335 | 37 336 | }, 337 | layer = self._base_layer + 2 338 | }) 339 | self._dot_count = 0 340 | self._max_dot_count = 4 341 | self._init_progress = 0 342 | self._fake_progress = 0 343 | self._max_bar_width = 0 344 | self._t = 0 345 | 346 | self:setup(res, progress) 347 | end 348 | local setup = LightLoadingScreenGuiScript.setup 349 | function LightLoadingScreenGuiScript:setup(res, progress) 350 | if self._base_layer ~= 1001 then 351 | return setup(self, res, progress) 352 | end 353 | 354 | make_fine_text(self._title_text) 355 | self._indicator:set_rightbottom(self._indicator:parent():w(), self._indicator:parent():h()) 356 | self._logo:set_center(self._indicator:center()) 357 | self._title_text:set_right(self._indicator:left()) 358 | self._title_text:set_center_y(self._indicator:center_y() + 2) 359 | self._bg_gui:set_size(res.x, res.y) 360 | end 361 | 362 | function LightLoadingScreenGuiScript:update(progress, dt) 363 | if self._base_layer == 1001 then 364 | self._t = self._t + dt 365 | self._indicator:set_alpha(math.abs(math.sin(60 * self._t))) 366 | else 367 | self._indicator:rotate(180 * dt) 368 | end 369 | end 370 | 371 | elseif RequiredScript == "lib/setups/setup" then 372 | 373 | local start_boot_loading_screen = Setup.start_boot_loading_screen 374 | function Setup:start_boot_loading_screen() 375 | tweak_data.gui.LOADING_SCREEN_LAYER = VoidUI and VoidUI.options.enable_loadingscreen and 1001 or tweak_data.gui.LOADING_SCREEN_LAYER 376 | return start_boot_loading_screen(self) 377 | end 378 | 379 | local init_game = Setup.init_game 380 | function Setup:init_game() 381 | tweak_data.gui.LOADING_SCREEN_LAYER = VoidUI and VoidUI.options.enable_loadingscreen and 1001 or tweak_data.gui.LOADING_SCREEN_LAYER 382 | return init_game(self) 383 | end 384 | 385 | --Totally didn't steal some part of this. Shut up! 386 | local _start_loading_screen = Setup._start_loading_screen 387 | function Setup:_start_loading_screen(...) 388 | if Global.load_level then 389 | local level_tweak_data = Global.level_data and Global.level_data.level_id and tweak_data.levels[Global.level_data.level_id] 390 | if level_tweak_data then 391 | if VoidUI and VoidUI.options.enable_loadingscreen then 392 | if level_tweak_data.risk == nil then level_tweak_data.risk = {} end 393 | if VoidUI.options.loading_heistinfo then 394 | if managers.crime_spree:is_active() then 395 | local mission = managers.crime_spree and managers.crime_spree:get_mission() 396 | local level_data = managers.job and managers.job:current_level_data() 397 | level_tweak_data.risk.color = tweak_data.screen_colors.crime_spree_risk 398 | level_tweak_data.risk.name = managers.crime_spree and managers.localization:to_upper_text("cn_crime_spree").." "..managers.localization:to_upper_text("menu_cs_level", {level = managers.experience:cash_string(managers.crime_spree:server_spree_level(), "")}) or "" 399 | level_tweak_data.contractor = managers.localization:text(level_data.name_id) 400 | level_tweak_data.level = "+" .. managers.localization:text("menu_cs_level", {level = mission and mission.add or 0}) 401 | else 402 | local contract_data = managers.job and managers.job:current_contact_data() 403 | local job_data = managers.job and managers.job:current_job_data() 404 | local job_chain = managers.job and managers.job:current_job_chain_data() 405 | local level_data = managers.job and managers.job:current_level_data() 406 | local day = managers.job and managers.job:current_stage() or 0 407 | if day and job_data and job_data.name_id == "heist_rvd" then 408 | day = 3 - day 409 | end 410 | local days = job_chain and #job_chain or 0 411 | 412 | level_tweak_data.name_id = level_data and managers.localization:to_upper_text(level_data.name_id == "heist_branchbank_hl" and job_data.name_id or level_data.name_id) or "" 413 | level_tweak_data.risk.name = Global.game_settings and managers.localization:text(tweak_data.difficulty_name_ids[Global.game_settings.difficulty]) or "normal" 414 | level_tweak_data.risk.color = Global.game_settings.one_down and tweak_data.screen_colors.one_down or tweak_data.screen_colors.risk 415 | level_tweak_data.risk.current = managers.job and managers.job:current_difficulty_stars() 416 | level_tweak_data.risk.difficulties = tweak_data.difficulties 417 | level_tweak_data.risk.risk_textures = tweak_data.gui.blackscreen_risk_textures 418 | level_tweak_data.contractor = contract_data and managers.localization:text(contract_data.name_id) or "" 419 | level_tweak_data.days = days > 1 and managers.localization:text(job_data.name_id).." "..managers.localization:text("hud_days_title", {DAY = day, DAYS = days}) or "" 420 | end 421 | end 422 | level_tweak_data.briefing = "" --VoidUI.options.loading_briefing and managers.localization:text(level_tweak_data.briefing_id) or "" 423 | --[[ if VoidUI.LoadingScreenInfo and VoidUI.options.loading_players then 424 | level_tweak_data.peers = VoidUI.LoadingScreenInfo.peers 425 | level_tweak_data.additional_players = VoidUI.LoadingScreenInfo.additional_players 426 | level_tweak_data.player_count = VoidUI.LoadingScreenInfo.player_count 427 | level_tweak_data.chat_colors = tweak_data.chat_colors 428 | VoidUI.LoadingScreenInfo = nil 429 | end ]] 430 | end 431 | end 432 | end 433 | return _start_loading_screen(self, ...) 434 | end 435 | 436 | --[[ elseif RequiredScript == "lib/network/base/clientnetworksession" then 437 | local ok_to_load_level = ClientNetworkSession.ok_to_load_level 438 | function ClientNetworkSession:ok_to_load_level(load_counter, ...) 439 | if not VoidUI.options.loading_players and self._closing or self._received_ok_to_load_level or self._load_counter == load_counter then 440 | return ok_to_load_level(self, load_counter, ...) 441 | end 442 | ok_to_load_level(self, load_counter, ...) 443 | if managers.network and managers.network.matchmake and managers.network:session() then 444 | local lobby_handler = managers.network.matchmake.lobby_handler 445 | if not alive(lobby_handler) or lobby_handler.get_lobby_data == nil then 446 | return 447 | end 448 | 449 | local peers = {} 450 | local peer_count = 0 451 | for i, peer in pairs(managers.network:session():all_peers()) do 452 | if peer then 453 | table.insert(peers, {id = peer:id() or 0, name = peer:name() or ""}) 454 | if peer ~= managers.network:session():local_peer() then 455 | peer_count = peer_count + 1 456 | end 457 | end 458 | end 459 | local player_count = 0 460 | lobby_handler = lobby_handler:get_lobby_data() 461 | player_count = lobby_handler.num_players 462 | VoidUI.LoadingScreenInfo = { 463 | peers = peers, 464 | additional_players = player_count-peer_count > 0 and managers.localization:text("VoidUI_loading_others", {PLAYERS = player_count-peer_count}) or "", 465 | player_count = tonumber(player_count) 466 | } 467 | end 468 | end 469 | elseif RequiredScript == "lib/network/base/hostnetworksession" then 470 | local load_level = HostNetworkSession.load_level 471 | function HostNetworkSession:load_level(...) 472 | if managers.network and managers.network.matchmake and managers.network:session() and VoidUI.options.loading_players then 473 | local lobby_handler = managers.network.matchmake.lobby_handler 474 | if not alive(lobby_handler) or lobby_handler.get_lobby_data == nil or lobby_handler:get_lobby_data() == nil then 475 | return load_level(self, ...) 476 | end 477 | local peers = {} 478 | local peer_count = 0 479 | for i, peer in pairs(managers.network:session():all_peers()) do 480 | if peer then 481 | table.insert(peers, {id = peer:id() or 0, name = peer:name() or ""}) 482 | if peer ~= managers.network:session():local_peer() then 483 | peer_count = peer_count + 1 484 | end 485 | end 486 | end 487 | local player_count = 0 488 | lobby_handler = lobby_handler:get_lobby_data() 489 | player_count = lobby_handler.num_players 490 | VoidUI.LoadingScreenInfo = { 491 | peers = peers, 492 | additional_players = player_count-peer_count > 0 and managers.localization:text("VoidUI_loading_others", {PLAYERS = player_count-peer_count}) or "", 493 | player_count = tonumber(player_count) 494 | } 495 | end 496 | return load_level(self, ...) 497 | end ]] 498 | end -------------------------------------------------------------------------------- /menu/assault.json: -------------------------------------------------------------------------------- 1 | { 2 | "menu_id" : "assault", 3 | "parent_menu" : "options", 4 | "title" : "VoidUI_assault_title", 5 | "priority" : 3, 6 | "items" : [ 7 | { 8 | "type" : "toggle", 9 | "id" : "enable_assault", 10 | "is_parent" : true, 11 | "title" : "VoidUI_enable_assault_title", 12 | "description" : "VoidUI_enable_assault_decs", 13 | "default_value" : true 14 | }, 15 | { 16 | "type" : "divider" 17 | }, 18 | { 19 | "type" : "slider", 20 | "id" : "hud_assault_scale", 21 | "parent" : "enable_assault", 22 | "title" : "VoidUI_assault_scale_title", 23 | "description" : "VoidUI_assault_scale_desc", 24 | "percentage" : true, 25 | "default_value" : 1, 26 | "max" : 2, 27 | "min" : 0.65, 28 | "step" : 2 29 | }, 30 | { 31 | "type" : "toggle", 32 | "id" : "hostages", 33 | "parent" : "enable_assault", 34 | "title" : "VoidUI_hostages_title", 35 | "description" : "VoidUI_hostages_desc", 36 | "default_value" : true 37 | }, 38 | { 39 | "type" : "toggle", 40 | "id" : "pagers", 41 | "parent" : "enable_assault", 42 | "title" : "VoidUI_pagers_title", 43 | "description" : "VoidUI_pagers_desc", 44 | "default_value" : true 45 | }, 46 | { 47 | "type" : "multiple_choice", 48 | "id" : "jammers", 49 | "parent" : "enable_assault", 50 | "title" : "VoidUI_jammer_title", 51 | "description" : "VoidUI_jammer_desc", 52 | "items" : [ 53 | "VoidUI_disabled", 54 | "VoidUI_ecm_first", 55 | "VoidUI_ecm_last" 56 | ], 57 | "default_value" : 2 58 | }, 59 | { 60 | "type" : "toggle", 61 | "id" : "show_badge", 62 | "is_parent" : true, 63 | "parent" : "enable_assault", 64 | "title" : "VoidUI_badge_title", 65 | "description" : "VoidUI_badge_desc", 66 | "default_value" : true 67 | }, 68 | { 69 | "type" : "toggle", 70 | "id" : "anim_badge", 71 | "parent" : ["enable_assault", "show_badge"], 72 | "title" : "VoidUI_badge_anim_title", 73 | "description" : "VoidUI_badge_anim_desc", 74 | "default_value" : true 75 | } 76 | 77 | ] 78 | } 79 | -------------------------------------------------------------------------------- /menu/chat.json: -------------------------------------------------------------------------------- 1 | { 2 | "menu_id" : "chat", 3 | "parent_menu" : "options", 4 | "title" : "VoidUI_chat_title", 5 | "priority" : 8, 6 | "items" : [ 7 | { 8 | "type" : "label", 9 | "title" : "VoidUI_text_chat" 10 | }, 11 | { 12 | "type" : "toggle", 13 | "id" : "enable_chat", 14 | "title" : "VoidUI_enable_chat_title", 15 | "description" : "VoidUI_enable_chat_decs", 16 | "is_parent" : true, 17 | "default_value" : true 18 | }, 19 | { 20 | "type" : "slider", 21 | "id" : "hud_chat_scale", 22 | "parent" : "enable_chat", 23 | "title" : "VoidUI_chat_scale_title", 24 | "description" : "VoidUI_chat_scale_desc", 25 | "percentage" : true, 26 | "default_value" : 1, 27 | "max" : 2, 28 | "min" : 0.65, 29 | "step" : 2 30 | }, 31 | { 32 | "type" : "toggle", 33 | "id" : "show_charactername", 34 | "title" : "VoidUI_charactername_title", 35 | "description" : "VoidUI_charactername_desc", 36 | "parent" : "enable_chat", 37 | "default_value" : true 38 | }, 39 | { 40 | "type" : "multiple_choice", 41 | "id" : "chattime", 42 | "parent" : "enable_chat", 43 | "title" : "VoidUI_chattime_title", 44 | "description" : "VoidUI_chattime_desc", 45 | "items" : [ 46 | "VoidUI_disabled", 47 | "VoidUI_gametime", 48 | "VoidUI_realtime" 49 | ], 50 | "default_value" : 1 51 | }, 52 | { 53 | "type" : "toggle", 54 | "id" : "chat_mouse", 55 | "title" : "VoidUI_chat_mouse_title", 56 | "description" : "VoidUI_chat_mouse_desc", 57 | "parent" : "enable_chat", 58 | "is_parent" : true, 59 | "default_value" : true 60 | }, 61 | { 62 | "type" : "multiple_choice", 63 | "id" : "chat_copy", 64 | "title" : "VoidUI_chat_copy_title", 65 | "description" : "VoidUI_chat_copy_desc", 66 | "parent" : ["enable_chat", "chat_mouse"], 67 | "items" : [ 68 | "VoidUI_disable", 69 | "VoidUI_chat_message", 70 | "VoidUI_chat_name", 71 | "VoidUI_chat_character", 72 | "VoidUI_chat_name_character" 73 | ], 74 | "default_value" : 5 75 | }, 76 | { 77 | "type" : "divider" 78 | }, 79 | { 80 | "type" : "label", 81 | "title" : "VoidUI_voice_chat" 82 | }, 83 | { 84 | "type" : "toggle", 85 | "id" : "enable_voice", 86 | "title" : "VoidUI_enable_voice_title", 87 | "description" : "VoidUI_enable_voice_decs", 88 | "is_parent" : true, 89 | "default_value" : true 90 | }, 91 | { 92 | "type" : "slider", 93 | "id" : "voice_scale", 94 | "parent" : "enable_voice", 95 | "title" : "VoidUI_voice_scale_title", 96 | "description" : "VoidUI_voice_scale_desc", 97 | "percentage" : true, 98 | "default_value" : 1, 99 | "max" : 2, 100 | "min" : 0.65, 101 | "step" : 2 102 | }, 103 | { 104 | "type" : "toggle", 105 | "id" : "voice_name", 106 | "title" : "VoidUI_voice_name_title", 107 | "description" : "VoidUI_voice_name_desc", 108 | "parent" : "enable_voice", 109 | "is_parent" : true, 110 | "default_value" : true 111 | } 112 | 113 | ] 114 | } 115 | -------------------------------------------------------------------------------- /menu/hudteammate.json: -------------------------------------------------------------------------------- 1 | { 2 | "menu_id" : "hudteammate", 3 | "parent_menu" : "options", 4 | "title" : "VoidUI_hudteammate_title", 5 | "priority" : 2, 6 | "items" : [ 7 | { 8 | "type" : "toggle", 9 | "id" : "teammate_panels", 10 | "is_parent" : true, 11 | "title" : "VoidUI_teammate_panels_title", 12 | "description" : "VoidUI_teammate_panels_decs", 13 | "default_value" : true 14 | }, 15 | { 16 | "type" : "divider" 17 | }, 18 | { 19 | "type" : "label", 20 | "title" : "VoidUI_main_panel", 21 | "parent" : "teammate_panels" 22 | }, 23 | { 24 | "type" : "slider", 25 | "id" : "hud_main_scale", 26 | "parent" : "teammate_panels", 27 | "title" : "VoidUI_main_scale_title", 28 | "description" : "VoidUI_main_scale_desc", 29 | "percentage" : true, 30 | "default_value" : 1, 31 | "max" : 2, 32 | "min" : 0.65, 33 | "step" : 2 34 | }, 35 | { 36 | "type" : "multiple_choice", 37 | "id" : "main_health", 38 | "parent" : "teammate_panels", 39 | "title" : "VoidUI_main_health_title", 40 | "description" : "VoidUI_main_health_desc", 41 | "items" : [ 42 | "VoidUI_disabled", 43 | "VoidUI_health_percentage", 44 | "VoidUI_health_real" 45 | ], 46 | "default_value" : 2 47 | }, 48 | { 49 | "type" : "slider", 50 | "id" : "main_anim_time", 51 | "parent" : "teammate_panels", 52 | "title" : "VoidUI_main_anim_time_title", 53 | "description" : "VoidUI_main_anim_time_desc", 54 | "suffix" : "s", 55 | "default_value" : 0.2, 56 | "max" : 0.5, 57 | "min" : 0.0, 58 | "step" : 2 59 | }, 60 | { 61 | "type" : "multiple_choice", 62 | "id" : "main_armor", 63 | "parent" : "teammate_panels", 64 | "title" : "VoidUI_armor_title", 65 | "description" : "VoidUI_armor_desc", 66 | "items" : [ 67 | "VoidUI_disabled", 68 | "VoidUI_health_percentage", 69 | "VoidUI_health_real" 70 | ], 71 | "default_value" : 2 72 | }, 73 | { 74 | "type" : "toggle", 75 | "id" : "totalammo", 76 | "parent" : "teammate_panels", 77 | "title" : "VoidUI_total_title", 78 | "description" : "VoidUI_total_decs", 79 | "default_value" : true 80 | }, 81 | { 82 | "type" : "toggle", 83 | "id" : "main_loud", 84 | "parent" : "teammate_panels", 85 | "title" : "VoidUI_main_loud_title", 86 | "description" : "VoidUI_main_loud_desc", 87 | "default_value" : true 88 | }, 89 | { 90 | "type" : "toggle", 91 | "id" : "main_stealth", 92 | "parent" : "teammate_panels", 93 | "title" : "VoidUI_main_stealth_title", 94 | "description" : "VoidUI_main_stealth_desc", 95 | "default_value" : true 96 | }, 97 | { 98 | "type" : "toggle", 99 | "id" : "ammo_pickup", 100 | "parent" : "teammate_panels", 101 | "title" : "VoidUI_ammo_pickup_title", 102 | "description" : "VoidUI_ammo_pickup_desc", 103 | "default_value" : true 104 | }, 105 | { 106 | "type" : "divider" 107 | }, 108 | { 109 | "type" : "label", 110 | "title" : "VoidUI_mate_panel", 111 | "parent" : "teammate_panels" 112 | }, 113 | { 114 | "type" : "slider", 115 | "id" : "hud_mate_scale", 116 | "parent" : "teammate_panels", 117 | "title" : "VoidUI_mate_scale_title", 118 | "description" : "VoidUI_mate_scale_desc", 119 | "percentage" : true, 120 | "default_value" : 1, 121 | "max" : 2, 122 | "min" : 0.65, 123 | "step" : 2 124 | }, 125 | { 126 | "type" : "multiple_choice", 127 | "id" : "mate_health", 128 | "parent" : "teammate_panels", 129 | "title" : "VoidUI_main_health_title", 130 | "description" : "VoidUI_mate_health_desc", 131 | "items" : [ 132 | "VoidUI_disabled", 133 | "VoidUI_health_percentage", 134 | "VoidUI_health_real" 135 | ], 136 | "default_value" : 2 137 | }, 138 | { 139 | "type" : "slider", 140 | "id" : "mate_anim_time", 141 | "parent" : "teammate_panels", 142 | "title" : "VoidUI_main_anim_time_title", 143 | "description" : "VoidUI_mate_anim_time_desc", 144 | "suffix" : "s", 145 | "default_value" : 0.2, 146 | "max" : 0.5, 147 | "min" : 0.0, 148 | "step" : 2 149 | }, 150 | { 151 | "type" : "multiple_choice", 152 | "id" : "mate_armor", 153 | "parent" : "teammate_panels", 154 | "title" : "VoidUI_armor_title", 155 | "description" : "VoidUI_mate_armor_desc", 156 | "items" : [ 157 | "VoidUI_disabled", 158 | "VoidUI_health_percentage", 159 | "VoidUI_health_real" 160 | ], 161 | "default_value" : 2 162 | }, 163 | { 164 | "type" : "toggle", 165 | "id" : "mate_loud", 166 | "parent" : "teammate_panels", 167 | "title" : "VoidUI_mate_loud_title", 168 | "description" : "VoidUI_mate_loud_desc", 169 | "default_value" : true 170 | }, 171 | { 172 | "type" : "toggle", 173 | "id" : "mate_stealth", 174 | "parent" : "teammate_panels", 175 | "title" : "VoidUI_mate_stealth_title", 176 | "description" : "VoidUI_mate_stealth_desc", 177 | "default_value" : true 178 | }, 179 | { 180 | "type" : "toggle", 181 | "id" : "mate_name", 182 | "parent" : "teammate_panels", 183 | "title" : "VoidUI_mate_name_title", 184 | "description" : "VoidUI_mate_name_desc", 185 | "default_value" : true 186 | }, 187 | { 188 | "type" : "toggle", 189 | "id" : "mate_upper", 190 | "parent" : "teammate_panels", 191 | "title" : "VoidUI_label_upper_title", 192 | "description" : "VoidUI_label_upper_desc", 193 | "default_value" : false 194 | }, 195 | { 196 | "type" : "toggle", 197 | "id" : "mate_interact", 198 | "parent" : "teammate_panels", 199 | "title" : "VoidUI_mate_interact_title", 200 | "description" : "VoidUI_mate_interact_desc", 201 | "default_value" : true 202 | }, 203 | { 204 | "type" : "multiple_choice", 205 | "id" : "mate_show", 206 | "parent" : "teammate_panels", 207 | "title" : "VoidUI_mate_show_title", 208 | "description" : "VoidUI_mate_show_desc", 209 | "items" : [ 210 | "VoidUI_disabled", 211 | "VoidUI_not_ai", 212 | "VoidUI_show" 213 | ], 214 | "default_value" : 3 215 | } 216 | ] 217 | } 218 | -------------------------------------------------------------------------------- /menu/interact.json: -------------------------------------------------------------------------------- 1 | { 2 | "menu_id" : "interact", 3 | "parent_menu" : "options", 4 | "title" : "VoidUI_interact_title", 5 | "priority" : 6, 6 | "items" : [ 7 | { 8 | "type" : "label", 9 | "parent" : "enable_interact", 10 | "title" : "VoidUI_interact" 11 | }, 12 | { 13 | "type" : "toggle", 14 | "id" : "enable_interact", 15 | "is_parent" : true, 16 | "title" : "VoidUI_enable_interact_title", 17 | "description" : "VoidUI_enable_interact_desc", 18 | "default_value" : true 19 | }, 20 | { 21 | "type" : "slider", 22 | "id" : "interact_scale", 23 | "parent" : "enable_interact", 24 | "title" : "VoidUI_interact_scale_title", 25 | "description" : "VoidUI_interact_scale_desc", 26 | "percentage" : true, 27 | "default_value" : 1, 28 | "max" : 2, 29 | "min" : 0.65, 30 | "step" : 2 31 | }, 32 | { 33 | "type" : "slider", 34 | "id" : "interact_y", 35 | "parent" : "enable_interact", 36 | "title" : "VoidUI_interact_y_title", 37 | "description" : "VoidUI_interact_y_desc", 38 | "default_value" : 40, 39 | "max" : 240, 40 | "min" : -340, 41 | "step" : 0 42 | }, 43 | { 44 | "type" : "toggle", 45 | "id" : "show_interact", 46 | "parent" : "enable_interact", 47 | "title" : "VoidUI_interacttime_title", 48 | "description" : "VoidUI_interacttime_desc", 49 | "default_value" : true 50 | }, 51 | { 52 | "type" : "divider" 53 | }, 54 | { 55 | "type" : "label", 56 | "parent" : "enable_suspicion", 57 | "title" : "VoidUI_suspicion" 58 | }, 59 | { 60 | "type" : "toggle", 61 | "id" : "enable_suspicion", 62 | "is_parent" : true, 63 | "title" : "VoidUI_enable_suspicion_title", 64 | "description" : "VoidUI_enable_suspicion_desc", 65 | "default_value" : true 66 | }, 67 | { 68 | "type" : "slider", 69 | "id" : "suspicion_scale", 70 | "parent" : "enable_suspicion", 71 | "title" : "VoidUI_suspicion_scale_title", 72 | "description" : "VoidUI_suspicion_scale_desc", 73 | "percentage" : true, 74 | "default_value" : 1, 75 | "max" : 2, 76 | "min" : 0.65, 77 | "step" : 2 78 | }, 79 | { 80 | "type" : "slider", 81 | "id" : "suspicion_y", 82 | "parent" : "enable_suspicion", 83 | "title" : "VoidUI_suspicion_y_title", 84 | "description" : "VoidUI_suspicion_y_desc", 85 | "default_value" : 160, 86 | "max" : 300, 87 | "min" : -300, 88 | "step" : 0 89 | } 90 | 91 | ] 92 | } 93 | -------------------------------------------------------------------------------- /menu/joining.json: -------------------------------------------------------------------------------- 1 | { 2 | "menu_id" : "joining", 3 | "parent_menu" : "options", 4 | "title" : "VoidUI_joining_title", 5 | "priority" : 9, 6 | "items" : [ 7 | { 8 | "type" : "toggle", 9 | "id" : "enable_joining", 10 | "title" : "VoidUI_enable_joining_title", 11 | "description" : "VoidUI_enable_joining_desc", 12 | "default_value" : true, 13 | "is_parent" : true 14 | }, 15 | { 16 | "type" : "toggle", 17 | "id" : "joining_rank", 18 | "title" : "VoidUI_mate_name_title", 19 | "description" : "VoidUI_joining_rank_desc", 20 | "default_value" : true, 21 | "parent" : "enable_joining" 22 | }, 23 | { 24 | "type" : "toggle", 25 | "id" : "joining_time", 26 | "title" : "VoidUI_joining_time_title", 27 | "description" : "VoidUI_joining_time_desc", 28 | "default_value" : true, 29 | "parent" : "enable_joining" 30 | }, 31 | { 32 | "type" : "toggle", 33 | "id" : "joining_border", 34 | "title" : "VoidUI_joining_border_title", 35 | "description" : "VoidUI_joining_border_desc", 36 | "default_value" : true, 37 | "parent" : "enable_joining" 38 | }, 39 | { 40 | "type" : "multiple_choice", 41 | "id" : "joining_anim", 42 | "title" : "VoidUI_joining_anim_title", 43 | "description" : "VoidUI_joining_anim_desc", 44 | "parent" : "enable_joining", 45 | "items" : [ 46 | "VoidUI_joining_anim_off", 47 | "VoidUI_joining_anim_rot", 48 | "VoidUI_joining_anim_grow", 49 | "VoidUI_joining_anim_full" 50 | ], 51 | "default_value" : 4 52 | }, 53 | { 54 | "type" : "toggle", 55 | "id" : "joining_mods", 56 | "title" : "VoidUI_joining_mods_title", 57 | "description" : "VoidUI_joining_mods_desc", 58 | "is_parent" : true, 59 | "default_value" : false, 60 | "parent" : "enable_joining" 61 | }, 62 | { 63 | "type" : "slider", 64 | "id" : "joining_mods_scale", 65 | "title" : "VoidUI_joining_mods_scale_title", 66 | "description" : "VoidUI_joining_mods_scale_desc", 67 | "parent" : ["enable_joining", "joining_mods"], 68 | "percentage" : true, 69 | "default_value" : 1, 70 | "max" : 2, 71 | "min" : 0.65, 72 | "step" : 2 73 | }, 74 | { 75 | "type" : "toggle", 76 | "id" : "joining_drawing", 77 | "title" : "VoidUI_joining_drawing_title", 78 | "description" : "VoidUI_joining_drawing_desc", 79 | "default_value" : true, 80 | "parent" : "enable_joining" 81 | } 82 | 83 | ] 84 | } 85 | -------------------------------------------------------------------------------- /menu/label.json: -------------------------------------------------------------------------------- 1 | { 2 | "menu_id" : "label", 3 | "parent_menu" : "options", 4 | "title" : "VoidUI_label_title", 5 | "priority" : 6, 6 | "items" : [ 7 | { 8 | "type" : "label", 9 | "parent" : "enable_labels", 10 | "title" : "VoidUI_label" 11 | }, 12 | { 13 | "type" : "toggle", 14 | "id" : "enable_labels", 15 | "is_parent" : true, 16 | "title" : "VoidUI_enable_labels_title", 17 | "description" : "VoidUI_enable_labels_desc", 18 | "default_value" : true 19 | }, 20 | { 21 | "type" : "toggle", 22 | "id" : "label_jokers", 23 | "parent" : "enable_labels", 24 | "title" : "VoidUI_jokernames_title", 25 | "description" : "VoidUI_jokernames_desc", 26 | "default_value" : true 27 | }, 28 | { 29 | "type" : "toggle", 30 | "id" : "health_jokers", 31 | "parent" : "enable_labels", 32 | "title" : "VoidUI_jokerhealth_title", 33 | "description" : "VoidUI_jokerhealth_desc", 34 | "default_value" : true 35 | }, 36 | { 37 | "type" : "slider", 38 | "id" : "label_scale", 39 | "parent" : "enable_labels", 40 | "title" : "VoidUI_label_scale_title", 41 | "description" : "VoidUI_label_scale_desc", 42 | "percentage" : true, 43 | "default_value" : 1, 44 | "max" : 2, 45 | "min" : 0.65, 46 | "step" : 2 47 | }, 48 | { 49 | "type" : "toggle", 50 | "id" : "label_upper", 51 | "parent" : "enable_labels", 52 | "title" : "VoidUI_label_upper_title", 53 | "description" : "VoidUI_label_upper_desc", 54 | "default_value" : false 55 | }, 56 | { 57 | "type" : "toggle", 58 | "id" : "label_minmode", 59 | "is_parent" : true, 60 | "parent" : "enable_labels", 61 | "title" : "VoidUI_minlabel_title", 62 | "description" : "VoidUI_minlabel_desc", 63 | "default_value" : true 64 | }, 65 | { 66 | "type" : "slider", 67 | "id" : "label_minscale", 68 | "parent" : ["enable_labels", "label_minmode"], 69 | "title" : "VoidUI_label_minscale_title", 70 | "description" : "VoidUI_label_minscale_desc", 71 | "percentage" : true, 72 | "default_value" : 1, 73 | "max" : 2, 74 | "min" : 0.65, 75 | "step" : 2 76 | }, 77 | { 78 | "type" : "slider", 79 | "id" : "label_minmode_dist", 80 | "parent" : ["enable_labels", "label_minmode"], 81 | "title" : "VoidUI_mindist_title", 82 | "description" : "VoidUI_mindist_desc", 83 | "suffix" : "m", 84 | "default_value" : 7, 85 | "max" : 30, 86 | "min" : 0, 87 | "step" : 0 88 | }, 89 | { 90 | "type" : "slider", 91 | "id" : "label_minmode_dot", 92 | "parent" : ["enable_labels", "label_minmode"], 93 | "title" : "VoidUI_mindot_title", 94 | "description" : "VoidUI_mindot_desc", 95 | "suffix" : "m", 96 | "default_value" : 1, 97 | "max" : 2, 98 | "min" : 0.1, 99 | "step" : 1 100 | }, 101 | { 102 | "type" : "divider" 103 | }, 104 | { 105 | "type" : "label", 106 | "parent" : "enable_waypoints", 107 | "title" : "VoidUI_waypoints" 108 | }, 109 | { 110 | "type" : "toggle", 111 | "id" : "enable_waypoints", 112 | "is_parent" : true, 113 | "title" : "VoidUI_enable_waypoints_title", 114 | "description" : "VoidUI_enable_waypoints_desc", 115 | "default_value" : true 116 | }, 117 | { 118 | "type" : "slider", 119 | "id" : "waypoint_scale", 120 | "parent" : "enable_waypoints", 121 | "title" : "VoidUI_waypoint_scale_title", 122 | "description" : "VoidUI_waypoint_scale_desc", 123 | "percentage" : true, 124 | "default_value" : 0.8, 125 | "max" : 2, 126 | "min" : 0.65, 127 | "step" : 2 128 | 129 | }, 130 | { 131 | "type" : "toggle", 132 | "id" : "label_waypoint_offscreen", 133 | "parent" : "enable_waypoints", 134 | "title" : "VoidUI_waypoint_offscreen_title", 135 | "description" : "VoidUI_waypoint_offscreen_desc", 136 | "default_value" : false 137 | }, 138 | { 139 | "type" : "slider", 140 | "id" : "waypoint_radius", 141 | "parent" : "enable_waypoints", 142 | "title" : "VoidUI_waypoint_radius_title", 143 | "description" : "VoidUI_waypoint_radius_desc", 144 | "suffix" : "m", 145 | "default_value" : 160, 146 | "max" : 340, 147 | "min" : 100, 148 | "step" : 2 149 | } 150 | 151 | ] 152 | } 153 | -------------------------------------------------------------------------------- /menu/loadingscreen.json: -------------------------------------------------------------------------------- 1 | { 2 | "menu_id" : "loadingscreen", 3 | "parent_menu" : "options", 4 | "title" : "VoidUI_blackscreen_title", 5 | "priority" : 10, 6 | "items" : [ 7 | { 8 | "type" : "label", 9 | "title" : "VoidUI_blackscreen", 10 | "parent" : "enable_blackscreen" 11 | }, 12 | { 13 | "type" : "toggle", 14 | "id" : "enable_blackscreen", 15 | "title" : "VoidUI_enable_blackscreen_title", 16 | "description" : "VoidUI_enable_blackscreen_desc", 17 | "default_value" : true, 18 | "is_parent" : true 19 | }, 20 | { 21 | "type" : "toggle", 22 | "id" : "blackscreen_map", 23 | "title" : "VoidUI_blackscreen_map_title", 24 | "description" : "VoidUI_blackscreen_map_desc", 25 | "default_value" : true, 26 | "parent" : "enable_blackscreen" 27 | }, 28 | { 29 | "type" : "toggle", 30 | "id" : "blackscreen_risk", 31 | "title" : "VoidUI_blackscreen_risk_title", 32 | "description" : "VoidUI_blackscreen_risk_desc", 33 | "default_value" : true, 34 | "parent" : "enable_blackscreen" 35 | }, 36 | { 37 | "type" : "toggle", 38 | "id" : "blackscreen_skull", 39 | "title" : "VoidUI_blackscreen_skull_title", 40 | "description" : "VoidUI_blackscreen_skull_desc", 41 | "default_value" : true, 42 | "parent" : "enable_blackscreen" 43 | }, 44 | { 45 | "type" : "toggle", 46 | "id" : "blackscreen_linger", 47 | "title" : "VoidUI_blackscreen_linger_title", 48 | "description" : "VoidUI_blackscreen_linger_desc", 49 | "default_value" : true, 50 | "parent" : "enable_blackscreen" 51 | }, 52 | { 53 | "type" : "slider", 54 | "id" : "blackscreen_time", 55 | "title" : "VoidUI_blackscreen_time_title", 56 | "description" : "VoidUI_blackscreen_time_desc", 57 | "parent" : "enable_blackscreen", 58 | "default_value" : 0, 59 | "suffix" : "s", 60 | "max" : 2, 61 | "min" : 0, 62 | "step" : 1 63 | }, 64 | { 65 | "type" : "divider" 66 | }, 67 | { 68 | "type" : "label", 69 | "title" : "VoidUI_loading", 70 | "parent" : "enable_loadingscreen" 71 | }, 72 | { 73 | "type" : "toggle", 74 | "id" : "enable_loadingscreen", 75 | "title" : "VoidUI_enable_loadingscreen_title", 76 | "description" : "VoidUI_enable_loadingscreen_desc", 77 | "default_value" : true, 78 | "is_parent" : true 79 | }, 80 | { 81 | "type" : "toggle", 82 | "id" : "loading_heistinfo", 83 | "title" : "VoidUI_loading_heistinfo_title", 84 | "description" : "VoidUI_loading_heistinfo_desc", 85 | "default_value" : true, 86 | "parent" : "enable_loadingscreen" 87 | }, 88 | 89 | { 90 | "type" : "toggle", 91 | "id" : "loading_briefing", 92 | "title" : "VoidUI_loading_briefing_title", 93 | "description" : "VoidUI_loading_briefing_desc", 94 | "default_value" : false, 95 | "parent" : "enable_loadingscreen" 96 | } 97 | 98 | ] 99 | } 100 | -------------------------------------------------------------------------------- /menu/objectives.json: -------------------------------------------------------------------------------- 1 | { 2 | "menu_id" : "objectives", 3 | "parent_menu" : "options", 4 | "title" : "VoidUI_objectives_title", 5 | "priority" : 4, 6 | "items" : [ 7 | { 8 | "type" : "slider", 9 | "id" : "hud_objectives_scale", 10 | "title" : "VoidUI_objectives_scale_title", 11 | "description" : "VoidUI_objectives_scale_desc", 12 | "percentage" : true, 13 | "default_value" : 1, 14 | "max" : 2, 15 | "min" : 0.65, 16 | "step" : 2 17 | }, 18 | { 19 | "type" : "divider" 20 | }, 21 | { 22 | "type" : "label", 23 | "parent" : "enable_timer", 24 | "title" : "VoidUI_timer_panel" 25 | }, 26 | { 27 | "type" : "toggle", 28 | "id" : "enable_timer", 29 | "is_parent" : true, 30 | "title" : "VoidUI_enable_timer_title", 31 | "description" : "VoidUI_enable_timer_desc", 32 | "default_value" : true 33 | }, 34 | { 35 | "type" : "multiple_choice", 36 | "id" : "show_timer", 37 | "parent" : "enable_timer", 38 | "title" : "VoidUI_objectives_show_timer_title", 39 | "description" : "VoidUI_objectives_show_timer_desc", 40 | "items" : [ 41 | "VoidUI_disabled", 42 | "VoidUI_on_scoreboard", 43 | "VoidUI_show" 44 | ], 45 | "default_value" : 3 46 | }, 47 | { 48 | "type" : "toggle", 49 | "id" : "show_levelname", 50 | "parent" : "enable_timer", 51 | "title" : "VoidUI_levelname_title", 52 | "description" : "VoidUI_levelname_desc", 53 | "default_value" : true 54 | }, 55 | { 56 | "type" : "toggle", 57 | "id" : "show_ghost_icon", 58 | "parent" : "enable_timer", 59 | "title" : "VoidUI_ghost_title", 60 | "description" : "VoidUI_ghost_desc", 61 | "default_value" : true 62 | }, 63 | { 64 | "type" : "toggle", 65 | "id" : "show_loot", 66 | "parent" : "enable_timer", 67 | "title" : "VoidUI_loot_title", 68 | "description" : "VoidUI_loot_desc", 69 | "default_value" : true 70 | }, 71 | { 72 | "type" : "divider" 73 | }, 74 | { 75 | "type" : "label", 76 | "parent" : "enable_objectives", 77 | "title" : "VoidUI_objectives_panel" 78 | }, 79 | { 80 | "type" : "toggle", 81 | "id" : "enable_objectives", 82 | "is_parent" : true, 83 | "title" : "VoidUI_enable_objectives_title", 84 | "description" : "VoidUI_enable_objectives_desc", 85 | "default_value" : true 86 | }, 87 | { 88 | "type" : "multiple_choice", 89 | "id" : "show_objectives", 90 | "parent" : "enable_objectives", 91 | "title" : "VoidUI_objectives_show_title", 92 | "description" : "VoidUI_objectives_show_desc", 93 | "items" : [ 94 | "VoidUI_disabled", 95 | "VoidUI_on_scoreboard", 96 | "VoidUI_show" 97 | ], 98 | "default_value" : 3 99 | }, 100 | { 101 | "type" : "slider", 102 | "id" : "hud_objective_history", 103 | "parent" : "enable_objectives", 104 | "title" : "VoidUI_objective_history_title", 105 | "description" : "VoidUI_objective_history_desc", 106 | "default_value" : 3, 107 | "max" : 6, 108 | "min" : 0, 109 | "step" : 0 110 | } 111 | 112 | ] 113 | } 114 | -------------------------------------------------------------------------------- /menu/options.json: -------------------------------------------------------------------------------- 1 | { 2 | "menu_id" : "options", 3 | "title" : "VoidUI_options_title", 4 | "priority" : 1, 5 | "items" : [ 6 | { 7 | "type" : "label", 8 | "title" : "VoidUI_ingame_hud" 9 | }, 10 | { 11 | "type" : "button", 12 | "id" : "hudteammate", 13 | "title" : "VoidUI_hudteammate_title", 14 | "description" : "VoidUI_hudteammate_desc", 15 | "next_menu" : "hudteammate" 16 | }, 17 | { 18 | "type" : "button", 19 | "id" : "assault", 20 | "title" : "VoidUI_assault_title", 21 | "description" : "VoidUI_assault_desc", 22 | "next_menu" : "assault" 23 | }, 24 | { 25 | "type" : "button", 26 | "id" : "objectives", 27 | "title" : "VoidUI_objectives_title", 28 | "description" : "VoidUI_objectives_desc", 29 | "next_menu" : "objectives" 30 | }, 31 | { 32 | "type" : "button", 33 | "id" : "presenter", 34 | "title" : "VoidUI_presenter_title", 35 | "description" : "VoidUI_presenter_desc", 36 | "next_menu" : "presenter" 37 | }, 38 | { 39 | "type" : "button", 40 | "id" : "interact", 41 | "title" : "VoidUI_interact_title", 42 | "description" : "VoidUI_interact_desc", 43 | "next_menu" : "interact" 44 | }, 45 | { 46 | "type" : "button", 47 | "id" : "label", 48 | "title" : "VoidUI_label_title", 49 | "description" : "VoidUI_label_desc", 50 | "next_menu" : "label" 51 | }, 52 | { 53 | "type" : "button", 54 | "id" : "scoreboard", 55 | "title" : "VoidUI_stats_title", 56 | "description" : "VoidUI_stats_desc", 57 | "next_menu" : "scoreboard" 58 | }, 59 | { 60 | "type" : "button", 61 | "id" : "chat", 62 | "title" : "VoidUI_chat_title", 63 | "description" : "VoidUI_chat_desc", 64 | "next_menu" : "chat" 65 | }, 66 | { 67 | "type" : "button", 68 | "id" : "subtitles", 69 | "title" : "VoidUI_subtitles_title", 70 | "description" : "VoidUI_subtitles_desc", 71 | "next_menu" : "subtitles" 72 | }, 73 | { 74 | "type" : "button", 75 | "id" : "joining", 76 | "title" : "VoidUI_joining_title", 77 | "description" : "VoidUI_joining_desc", 78 | "next_menu" : "joining" 79 | }, 80 | { 81 | "type" : "slider", 82 | "id" : "hud_scale", 83 | "title" : "VoidUI_hud_scale_title", 84 | "description" : "VoidUI_hud_scale_desc", 85 | "callback" : "SetGlobalHudscale", 86 | "percentage" : true, 87 | "default_value" : 1, 88 | "max" : 2, 89 | "min" : 0.65, 90 | "step" : 2 91 | }, 92 | { 93 | "type" : "divider" 94 | }, 95 | { 96 | "type" : "label", 97 | "title" : "VoidUI_interface" 98 | }, 99 | { 100 | "type" : "button", 101 | "id" : "loadingscreen", 102 | "title" : "VoidUI_blackscreen_title", 103 | "description" : "VoidUI_blackscreen_desc", 104 | "next_menu" : "loadingscreen" 105 | }, 106 | { 107 | "type" : "divider" 108 | }, 109 | { 110 | "type" : "label", 111 | "title" : "VoidUI_extras" 112 | }, 113 | { 114 | "type" : "toggle", 115 | "id" : "outlines", 116 | "title" : "VoidUI_outlines_title", 117 | "description" : "VoidUI_outlines_desc", 118 | "default_value" : true 119 | }, 120 | { 121 | "type" : "multiple_choice", 122 | "id" : "assault_lines", 123 | "title" : "VoidUI_assault_lines_title", 124 | "description" : "VoidUI_assault_lines_desc", 125 | "items" : [ 126 | "VoidUI_disable", 127 | "VoidUI_assault_lines_30sec", 128 | "VoidUI_assault_lines_every10sec" 129 | ], 130 | "default_value" : 3 131 | }, 132 | { 133 | "type" : "button", 134 | "id" : "reset_options", 135 | "title" : "VoidUI_reset_title", 136 | "description" : "VoidUI_reset_desc", 137 | "callback" : "ResetOptions" 138 | } 139 | 140 | ] 141 | } 142 | -------------------------------------------------------------------------------- /menu/presenter.json: -------------------------------------------------------------------------------- 1 | { 2 | "menu_id" : "presenter", 3 | "parent_menu" : "options", 4 | "title" : "VoidUI_presenter_title", 5 | "priority" : 5, 6 | "items" : [ 7 | { 8 | "type" : "label", 9 | "parent" : "enable_presenter", 10 | "title" : "VoidUI_presenter_panel" 11 | }, 12 | { 13 | "type" : "toggle", 14 | "id" : "enable_presenter", 15 | "is_parent" : true, 16 | "title" : "VoidUI_enable_presenter_title", 17 | "description" : "VoidUI_enable_presenter_desc", 18 | "default_value" : true 19 | }, 20 | { 21 | "type" : "slider", 22 | "id" : "presenter_scale", 23 | "parent" : "enable_presenter", 24 | "title" : "VoidUI_presenter_scale_title", 25 | "description" : "VoidUI_presenter_scale_desc", 26 | "percentage" : true, 27 | "default_value" : 1, 28 | "max" : 2, 29 | "min" : 0.65, 30 | "step" : 2 31 | }, 32 | { 33 | "type" : "slider", 34 | "id" : "presenter_buffer", 35 | "parent" : "enable_presenter", 36 | "title" : "VoidUI_presenter_buffer_title", 37 | "description" : "VoidUI_presenter_buffer_desc", 38 | "default_value" : 5, 39 | "max" : 10, 40 | "min" : 1, 41 | "step" : 0 42 | }, 43 | { 44 | "type" : "toggle", 45 | "id" : "presenter_sound", 46 | "parent" : "enable_presenter", 47 | "title" : "VoidUI_presenter_sound_title", 48 | "description" : "VoidUI_presenter_sound_desc", 49 | "default_value" : false 50 | }, 51 | { 52 | "type" : "divider" 53 | }, 54 | { 55 | "type" : "label", 56 | "parent" : "enable_hint", 57 | "title" : "VoidUI_hint_panel" 58 | }, 59 | { 60 | "type" : "toggle", 61 | "id" : "enable_hint", 62 | "is_parent" : true, 63 | "title" : "VoidUI_enable_hint_title", 64 | "description" : "VoidUI_enable_hint_desc", 65 | "default_value" : true 66 | }, 67 | { 68 | "type" : "toggle", 69 | "id" : "vape_hints", 70 | "title" : "VoidUI_vape_hints_title", 71 | "description" : "VoidUI_vape_hints_desc", 72 | "default_value" : true 73 | }, 74 | { 75 | "type" : "slider", 76 | "id" : "hint_scale", 77 | "parent" : "enable_hint", 78 | "title" : "VoidUI_hint_scale_title", 79 | "description" : "VoidUI_hint_scale_desc", 80 | "percentage" : true, 81 | "default_value" : 1, 82 | "max" : 2, 83 | "min" : 0.65, 84 | "step" : 2 85 | }, 86 | { 87 | "type" : "toggle", 88 | "id" : "hint_color", 89 | "parent" : "enable_hint", 90 | "title" : "VoidUI_hint_color_title", 91 | "description" : "VoidUI_hint_color_desc", 92 | "default_value" : true 93 | }, 94 | { 95 | "type" : "toggle", 96 | "id" : "hint_anim", 97 | "parent" : "enable_hint", 98 | "title" : "VoidUI_hint_anim_title", 99 | "description" : "VoidUI_hint_anim_desc", 100 | "default_value" : true 101 | }, 102 | { 103 | "type" : "divider" 104 | }, 105 | { 106 | "type" : "label", 107 | "parent" : "enable_challanges", 108 | "title" : "VoidUI_challanges_panel" 109 | }, 110 | { 111 | "type" : "toggle", 112 | "id" : "enable_challanges", 113 | "is_parent" : true, 114 | "title" : "VoidUI_enable_challanges_title", 115 | "description" : "VoidUI_enable_challanges_desc", 116 | "default_value" : true 117 | }, 118 | { 119 | "type" : "slider", 120 | "id" : "challanges_scale", 121 | "parent" : "enable_challanges", 122 | "title" : "VoidUI_presenter_scale_title", 123 | "description" : "VoidUI_hint_challanges_desc", 124 | "percentage" : true, 125 | "default_value" : 1, 126 | "max" : 2, 127 | "min" : 0.65, 128 | "step" : 2 129 | } 130 | 131 | ] 132 | } 133 | -------------------------------------------------------------------------------- /menu/scoreboard.json: -------------------------------------------------------------------------------- 1 | { 2 | "menu_id" : "scoreboard", 3 | "parent_menu" : "options", 4 | "title" : "VoidUI_stats_title", 5 | "priority" : 7, 6 | "items" : [ 7 | { 8 | "type" : "toggle", 9 | "id" : "enable_stats", 10 | "title" : "VoidUI_enable_stats_title", 11 | "description" : "VoidUI_enable_stats_desc", 12 | "is_parent" : true, 13 | "default_value" : true 14 | }, 15 | { 16 | "type" : "slider", 17 | "id" : "scoreboard_scale", 18 | "parent" : "enable_stats", 19 | "title" : "VoidUI_scoreboard_scale_title", 20 | "description" : "VoidUI_scoreboard_scale_desc", 21 | "percentage" : true, 22 | "default_value" : 1, 23 | "max" : 2, 24 | "min" : 0.65, 25 | "step" : 2 26 | }, 27 | { 28 | "type" : "toggle", 29 | "id" : "scoreboard_blur", 30 | "title" : "VoidUI_blur_title", 31 | "description" : "VoidUI_blur_desc", 32 | "parent" : "enable_stats", 33 | "default_value" : true 34 | }, 35 | { 36 | "type" : "toggle", 37 | "id" : "scoreboard_maxlevel", 38 | "title" : "VoidUI_scoreboard_maxlevel_title", 39 | "description" : "VoidUI_scoreboard_maxlevel_desc", 40 | "parent" : "enable_stats", 41 | "default_value" : true 42 | }, 43 | { 44 | "type" : "toggle", 45 | "id" : "scoreboard_accuracy", 46 | "title" : "VoidUI_scoreboard_accuracy_title", 47 | "description" : "VoidUI_scoreboard_accuracy_desc", 48 | "parent" : "enable_stats", 49 | "default_value" : true 50 | }, 51 | { 52 | "type" : "toggle", 53 | "id" : "scoreboard_delay", 54 | "title" : "VoidUI_scoreboard_delay_title", 55 | "description" : "VoidUI_scoreboard_delay_desc", 56 | "parent" : "enable_stats", 57 | "default_value" : false 58 | }, 59 | { 60 | "type" : "divider" 61 | }, 62 | { 63 | "type" : "toggle", 64 | "id" : "scoreboard", 65 | "title" : "VoidUI_scoreboard_title", 66 | "description" : "VoidUI_scoreboard_desc", 67 | "is_parent" : true, 68 | "parent" : "enable_stats", 69 | "default_value" : true 70 | }, 71 | { 72 | "type" : "toggle", 73 | "id" : "scoreboard_character", 74 | "title" : "VoidUI_scoreboard_character_title", 75 | "description" : "VoidUI_scoreboard_character_desc", 76 | "parent" : ["enable_stats", "scoreboard"], 77 | "default_value" : true 78 | }, 79 | { 80 | "type" : "toggle", 81 | "id" : "scoreboard_skills", 82 | "title" : "VoidUI_scoreboard_skills_title", 83 | "description" : "VoidUI_scoreboard_skills_desc", 84 | "parent" : ["enable_stats", "scoreboard"], 85 | "default_value" : true 86 | }, 87 | { 88 | "type" : "multiple_choice", 89 | "id" : "scoreboard_kills", 90 | "parent" : ["enable_stats", "scoreboard"], 91 | "title" : "VoidUI_scoreboard_kills_title", 92 | "description" : "VoidUI_scoreboard_kills_desc", 93 | "items" : [ 94 | "VoidUI_disable", 95 | "VoidUI_nonspecial", 96 | "VoidUI_withspecial" 97 | ], 98 | "default_value" : 3 99 | }, 100 | { 101 | "type" : "toggle", 102 | "id" : "scoreboard_specials", 103 | "title" : "VoidUI_scoreboard_specials_title", 104 | "description" : "VoidUI_scoreboard_specials_desc", 105 | "parent" : ["enable_stats", "scoreboard"], 106 | "default_value" : true 107 | }, 108 | { 109 | "type" : "toggle", 110 | "id" : "scoreboard_civs", 111 | "title" : "VoidUI_scoreboard_civs_title", 112 | "description" : "VoidUI_scoreboard_civs_desc", 113 | "parent" : ["enable_stats", "scoreboard"], 114 | "default_value" : true 115 | }, 116 | { 117 | "type" : "toggle", 118 | "id" : "scoreboard_downs", 119 | "title" : "VoidUI_scoreboard_downs_title", 120 | "description" : "VoidUI_scoreboard_downs_desc", 121 | "parent" : ["enable_stats", "scoreboard"], 122 | "default_value" : true 123 | }, 124 | { 125 | "type" : "toggle", 126 | "id" : "scoreboard_downs_no_reset", 127 | "title" : "VoidUI_scoreboard_downs_no_reset_title", 128 | "description" : "VoidUI_scoreboard_downs_no_reset_desc", 129 | "parent" : ["enable_stats", "scoreboard"], 130 | "default_value" : false 131 | }, 132 | { 133 | "type" : "toggle", 134 | "id" : "scoreboard_weapons", 135 | "title" : "VoidUI_scoreboard_weapons_title", 136 | "description" : "VoidUI_scoreboard_weapons_desc", 137 | "parent" : ["enable_stats", "scoreboard"], 138 | "default_value" : true 139 | }, 140 | { 141 | "type" : "multiple_choice", 142 | "id" : "scoreboard_skins", 143 | "parent" : ["enable_stats", "scoreboard"], 144 | "title" : "VoidUI_scoreboard_skins_title", 145 | "description" : "VoidUI_scoreboard_skins_desc", 146 | "items" : [ 147 | "VoidUI_disable", 148 | "VoidUI_rarity", 149 | "VoidUI_norarity" 150 | ], 151 | "default_value" : 2 152 | }, 153 | { 154 | "type" : "toggle", 155 | "id" : "scoreboard_armor", 156 | "title" : "VoidUI_scoreboard_armor_title", 157 | "description" : "VoidUI_scoreboard_armor_desc", 158 | "parent" : ["enable_stats", "scoreboard"], 159 | "default_value" : true 160 | }, 161 | { 162 | "type" : "toggle", 163 | "id" : "scoreboard_perk", 164 | "title" : "VoidUI_scoreboard_perk_title", 165 | "description" : "VoidUI_scoreboard_perk_desc", 166 | "parent" : ["enable_stats", "scoreboard"], 167 | "default_value" : true 168 | }, 169 | { 170 | "type" : "toggle", 171 | "id" : "scoreboard_playtime", 172 | "title" : "VoidUI_scoreboard_playtime_title", 173 | "description" : "VoidUI_scoreboard_playtime_desc", 174 | "parent" : ["enable_stats", "scoreboard"], 175 | "default_value" : true 176 | }, 177 | { 178 | "type" : "multiple_choice", 179 | "id" : "scoreboard_toggle", 180 | "parent" : ["enable_stats", "scoreboard"], 181 | "title" : "VoidUI_scoreboard_toggle_title", 182 | "description" : "VoidUI_scoreboard_toggle_desc", 183 | "items" : [ 184 | "VoidUI_jump", 185 | "VoidUI_crouch", 186 | "VoidUI_rmb" 187 | ], 188 | "default_value" : 1 189 | }, 190 | { 191 | "type" : "toggle", 192 | "id" : "scoreboard_ping", 193 | "title" : "VoidUI_scoreboard_ping_title", 194 | "description" : "VoidUI_scoreboard_ping_desc", 195 | "is_parent" : true, 196 | "parent" : ["enable_stats", "scoreboard"], 197 | "default_value" : true 198 | }, 199 | { 200 | "type" : "slider", 201 | "id" : "ping_frequency", 202 | "title" : "VoidUI_ping_frequency_title", 203 | "description" : "VoidUI_ping_frequency_desc", 204 | "parent" : ["enable_stats", "scoreboard_ping", "scoreboard"], 205 | "suffix" : "s", 206 | "default_value" : 2, 207 | "max" : 10, 208 | "min" : 1, 209 | "step" : 0 210 | } 211 | 212 | ] 213 | } 214 | -------------------------------------------------------------------------------- /menu/subtitles.json: -------------------------------------------------------------------------------- 1 | { 2 | "menu_id" : "subtitles", 3 | "parent_menu" : "options", 4 | "title" : "VoidUI_subtitles_title", 5 | "priority" : 9, 6 | "items" : [ 7 | { 8 | "type" : "toggle", 9 | "id" : "enable_subtitles", 10 | "title" : "VoidUI_enable_subtitles_title", 11 | "description" : "VoidUI_enable_subtitles_desc", 12 | "is_parent" : true, 13 | "default_value" : true 14 | }, 15 | { 16 | "type" : "slider", 17 | "id" : "subtitle_scale", 18 | "parent" : "enable_subtitles", 19 | "title" : "VoidUI_subtitle_scale_title", 20 | "description" : "VoidUI_subtitle_scale_desc", 21 | "percentage" : true, 22 | "default_value" : 0.9, 23 | "max" : 2, 24 | "min" : 0.65, 25 | "step" : 2 26 | }, 27 | { 28 | "type" : "multiple_choice", 29 | "id" : "subtitles_bg", 30 | "title" : "VoidUI_subtitles_bg_title", 31 | "description" : "VoidUI_subtitles_bg_desc", 32 | "parent" : "enable_subtitles", 33 | "items" : [ 34 | "VoidUI_disable", 35 | "VoidUI_subtitles_shadow", 36 | "VoidUI_subtitles_fill" 37 | ], 38 | "default_value" : 2 39 | } 40 | 41 | ] 42 | } 43 | -------------------------------------------------------------------------------- /mod.txt: -------------------------------------------------------------------------------- 1 | { 2 | "name" : "Void UI", 3 | "description" : "A hud modification that aims to give the in game hud a fresh new look with some additional features.", 4 | "author" : "Xeletron, test1, Fanged Hex, VxWolf\nTranslation: Borderkeeper, Skyfrost, Esawo, CoolLKK, LycanCHKN\nSpecial thanks: Canada, B.Costa, CrafterBlade", 5 | "contact" : "xeletron1@gmail.com", 6 | "version" : "1.2.9.15", 7 | "blt_version" : 2, 8 | "image" : "mod_icon.png", 9 | "color" : "40 40 40", 10 | "priority" : 1, 11 | "updates": [ 12 | { 13 | "identifier": "voidui", 14 | "host": { 15 | "meta": "https://raw.githubusercontent.com/Pd2VoidTeam/VoidUI/master/updates/meta_voidui.json" 16 | } 17 | } 18 | ], 19 | "hooks" : [ 20 | {"hook_id" : "lib/managers/menumanager", "script_path" : "Main.lua"}, 21 | {"hook_id" : "lib/managers/hud/Hudteammate", "script_path" : "Main.lua"}, 22 | {"hook_id" : "lib/managers/hud/hudobjectives", "script_path" : "Main.lua"}, 23 | {"hook_id" : "lib/managers/hud/hudtemp", "script_path" : "Main.lua"}, 24 | {"hook_id" : "lib/managers/hud/hudblackscreen", "script_path" : "Main.lua"}, 25 | {"hook_id" : "lib/managers/hud/hudsuspicion", "script_path" : "Main.lua"}, 26 | {"hook_id" : "lib/states/ingamewaitingforplayers", "script_path" : "Main.lua"}, 27 | {"hook_id" : "lib/managers/menu/fadeoutguiobject", "script_path" : "Main.lua"}, 28 | {"hook_id" : "lib/managers/hudmanager", "script_path" : "Main.lua"}, 29 | {"hook_id" : "lib/managers/hudmanagerpd2", "script_path" : "Main.lua"}, 30 | {"hook_id" : "lib/units/beings/player/huskplayermovement", "script_path" : "Main.lua"}, 31 | {"hook_id" : "lib/units/beings/player/states/playerbleedout", "script_path" : "Main.lua"}, 32 | {"hook_id" : "lib/network/handlers/unitnetworkhandler", "script_path" : "Main.lua"}, 33 | {"hook_id" : "lib/units/equipment/doctor_bag/doctorbagbase", "script_path" : "Main.lua"}, 34 | {"hook_id" : "lib/states/ingamemaskoff", "script_path" : "Main.lua"}, 35 | {"hook_id" : "lib/managers/hud/hudheisttimer", "script_path" : "Main.lua"}, 36 | {"hook_id" : "lib/managers/hud/hudpresenter", "script_path" : "Main.lua"}, 37 | {"hook_id" : "lib/managers/hud/hudhint", "script_path" : "Main.lua"}, 38 | {"hook_id" : "lib/managers/hintmanager", "script_path" : "Main.lua"}, 39 | {"hook_id" : "lib/managers/hud/hudinteraction", "script_path" : "Main.lua"}, 40 | {"hook_id" : "lib/managers/hud/hudchat", "script_path" : "Main.lua"}, 41 | {"hook_id" : "lib/managers/hud/hudassaultcorner", "script_path" : "Main.lua"}, 42 | {"hook_id" : "lib/managers/group_ai_states/groupaistatebase", "script_path" : "Main.lua"}, 43 | {"hook_id" : "lib/managers/objectinteractionmanager", "script_path" : "Main.lua"}, 44 | {"hook_id" : "lib/units/contourext", "script_path" : "Main.lua"}, 45 | {"hook_id" : "lib/units/enemies/cop/huskcopbrain", "script_path" : "Main.lua"}, 46 | {"hook_id" : "lib/units/enemies/cop/copdamage", "script_path" : "Main.lua"}, 47 | {"hook_id" : "lib/units/player_team/teamaidamage", "script_path" : "Main.lua"}, 48 | {"hook_id" : "lib/units/player_team/huskteamaidamage", "script_path" : "Main.lua"}, 49 | {"hook_id" : "lib/units/equipment/ecm_jammer/ecmjammerbase", "script_path" : "Main.lua"}, 50 | {"hook_id" : "core/lib/managers/subtitle/coresubtitlepresenter", "script_path" : "Main.lua"}, 51 | {"hook_id" : "lib/managers/hud/hudwaitinglegend", "script_path" : "Main.lua"}, 52 | {"hook_id" : "lib/managers/hud/hudplayerdowned", "script_path" : "Main.lua"}, 53 | {"hook_id" : "lib/units/civilians/civiliandamage", "script_path" : "Main.lua"}, 54 | {"hook_id" : "lib/managers/hud/newhudstatsscreen", "script_path" : "Main.lua"}, 55 | {"hook_id" : "lib/managers/hud/hudstatsscreenskirmish", "script_path" : "Main.lua"}, 56 | {"hook_id" : "lib/units/player_team/teamaiinventory", "script_path" : "Main.lua"}, 57 | {"hook_id" : "lib/managers/achievmentmanager", "script_path" : "Main.lua"}, 58 | {"hook_id" : "lib/managers/hud/hudchallengenotification", "script_path" : "Main.lua"}, 59 | {"hook_id" : "lib/managers/playermanager", "script_path" : "Main.lua"}, 60 | {"hook_id" : "lib/utils/levelloadingscreenguiscript", "script_path" : "lua/menu/LevelLoadingScreen.lua"}, 61 | {"hook_id" : "lib/utils/lightloadingscreenguiscript", "script_path" : "lua/menu/LevelLoadingScreen.lua"}, 62 | {"hook_id" : "lib/network/base/basenetworksession", "script_path" : "Main.lua" }, 63 | {"hook_id" : "lib/network/base/clientnetworksession", "script_path" : "Main.lua" }, 64 | {"hook_id" : "lib/network/base/hostnetworksession", "script_path" : "Main.lua" }, 65 | {"hook_id" : "lib/setups/setup", "script_path" : "Main.lua" }, 66 | {"hook_id" : "lib/managers/menumanagerdialogs", "script_path" : "Main.lua" }, 67 | {"hook_id" : "lib/network/matchmaking/networkvoicechatsteam", "script_path" : "Main.lua" } 68 | ] 69 | } -------------------------------------------------------------------------------- /mod_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pd2VoidTeam/VoidUI/ecf6f3262eba591c0fc1f74386fe5aafe93dcc43/mod_icon.png -------------------------------------------------------------------------------- /updates/meta_voidui.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "ident": "voidui", 4 | "download_url": "https://github.com/Pd2VoidTeam/VoidUI/raw/master/updates//voidui.zip", 5 | "patchnotes_url": "https://github.com/Pd2VoidTeam/VoidUI/blob/master/README.md", 6 | "version": "1.2.9.15" 7 | } 8 | ] -------------------------------------------------------------------------------- /updates/voidui.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pd2VoidTeam/VoidUI/ecf6f3262eba591c0fc1f74386fe5aafe93dcc43/updates/voidui.zip --------------------------------------------------------------------------------