SHOW:
|
|
- or go back to the newest paste.
1 | if SERVER then | |
2 | AddCSLuaFile("TTTHUD.lua") | |
3 | resource.AddFile( "resource/fonts/Aero_Matics_Display.ttf" ) | |
4 | - | resource.AddSingleFile( "resource/fonts/Aero_Matics_Display.ttf" ) |
4 | + | resource.AddFile( "materials/fc_ttthud/fc_ttthud_health.png" ) |
5 | - | resource.AddSingleFile( "materials/fc_ttthud/fc_ttthud_health.png" ) |
5 | + | resource.AddFile( "materials/fc_ttthud/fc_ttthud_health_small.png" ) |
6 | - | resource.AddSingleFile( "materials/fc_ttthud/fc_ttthud_health_small.png" ) |
6 | + | resource.AddFile( "materials/fc_ttthud/fc_ttthud_armor.png" ) |
7 | - | resource.AddSingleFile( "materials/fc_ttthud/fc_ttthud_armor.png" ) |
7 | + | resource.AddFile( "materials/fc_ttthud/fc_ttthud_armor_small.png" ) |
8 | - | resource.AddSingleFile( "materials/fc_ttthud/fc_ttthud_armor_small.png" ) |
8 | + | |
9 | ||
10 | hook.Add("PostGamemodeLoaded", "FC_HUD", function() | |
11 | ||
12 | FC_HUD = {} | |
13 | ||
14 | ------------------ | |
15 | -- CONFIG START -- | |
16 | ------------------ | |
17 | ||
18 | FC_HUD.TeamBasedHP = false | |
19 | FC_HUD.DefaultTargetInfo = false | |
20 | FC_HUD.LargerStatus = false | |
21 | FC_HUD.ColoredRoleBack = false | |
22 | FC_HUD.ColoredRoleText = false | |
23 | FC_HUD.ShowOnlyHP = false | |
24 | ||
25 | ------------------ | |
26 | -- CONFIG START -- | |
27 | ------------------ | |
28 | ||
29 | surface.CreateFont( "FC_HUD_10", { font = "Aero Matics Display Regular", antialias = true, size = 10 } ) | |
30 | surface.CreateFont( "FC_HUD_20", { font = "Aero Matics Display Regular", antialias = true, size = 20 } ) | |
31 | surface.CreateFont( "FC_HUD_30", { font = "Aero Matics Display Regular", antialias = true, size = 30 } ) | |
32 | surface.CreateFont( "FC_HUD_40", { font = "Aero Matics Display Regular", antialias = true, size = 40 } ) | |
33 | ||
34 | FC_HUD.White = Material("vgui/white") | |
35 | FC_HUD.SmallHP = Material("fc_ttthud/fc_ttthud_health_small.png") | |
36 | FC_HUD.BigHP = Material("fc_ttthud/fc_ttthud_health.png") | |
37 | FC_HUD.SmallAR = Material("fc_ttthud/fc_ttthud_armor_small.png") | |
38 | FC_HUD.BigAR = Material("fc_ttthud/fc_ttthud_armor.png") | |
39 | ||
40 | FC_HUD.LastHP = nil | |
41 | FC_HUD.HPFallout = {} | |
42 | ||
43 | -- speeds | |
44 | local insert = table.insert | |
45 | ||
46 | -- clamp func, to prevent going outside of the square | |
47 | local function clamp(v) if (v > 1) then return 1 else return v end end | |
48 | ||
49 | local function NiceUV(x, y, w, h, perc, flipped) | |
50 | ||
51 | if flipped then | |
52 | ||
53 | if (prec == 0) then return {} end | |
54 | ||
55 | local tbl = {} -- our pizza | |
56 | insert(tbl, {x = x, y = y, u = 0.5, v = 0.5}) -- add center point in the middle to make a pizza shape | |
57 | ||
58 | -- v = up/down | |
59 | -- u = left/right | |
60 | ||
61 | -- top right, first we move from the middle to the right | |
62 | if (perc >= 315) then | |
63 | insert(tbl, {x = x + w - clamp((perc - 315) / 45) * w, y = y - h, u = 1 - clamp((perc - 315) / 45) / 2, v = 0}) | |
64 | end | |
65 | ||
66 | -- down right, then from right corner to bottom, it's easier in 90's | |
67 | if (perc >= 225) then | |
68 | insert(tbl, {x = x + w, y = y + h - clamp((perc - 225) / 90) * h * 2, u = 1, v = 1 - clamp((perc - 225) / 90)}) | |
69 | end | |
70 | ||
71 | -- down left | |
72 | if (perc >= 135) then | |
73 | insert(tbl, {x = x - w + clamp((perc - 135) / 90) * h * 2, y = y + h, u = clamp((perc - 135) / 90), v = 1}) | |
74 | end | |
75 | ||
76 | -- top left, and from bottom to up! | |
77 | if (perc >= 45) then | |
78 | insert(tbl, {x = x - w, y = y - h + clamp((perc - 45) / 90) * h * 2, u = 0, v = clamp((perc - 45) / 90)}) | |
79 | end | |
80 | ||
81 | -- top center, now go back to close our pizza up. We dont need to do an if here, as this is the last peice of this godly meal. | |
82 | insert(tbl, {x = x - clamp(perc / 45) * w, y = y - h, u = 0.5 - clamp(perc / 45) / 2, v = 0}) | |
83 | ||
84 | insert(tbl, {x = x, y = y - h, u = 0.5, v = 0}) -- add our startpoint for the pizza | |
85 | ||
86 | -- aparently, we got a full pizza! lets return this lovly meal. | |
87 | return tbl | |
88 | ||
89 | else | |
90 | ||
91 | local tbl = {} -- our pizza | |
92 | insert(tbl, {x = x, y = y, u = 0.5, v = 0.5}) -- add center point in the middle to make a pizza shape | |
93 | insert(tbl, {x = x, y = y - h, u = 0.5, v = 0}) -- add our startpoint for the pizza | |
94 | ||
95 | -- v = up/down | |
96 | -- u = left/right | |
97 | ||
98 | -- top right, first we move from the middle to the right | |
99 | if (perc > 45) then insert(tbl, {x = x + w, y = y - h, u = 1, v = 0}) | |
100 | else insert(tbl, {x = x + perc / 45 * w, y = y - h, u = 0.5 + clamp(perc / 45) / 2, v = 0}) return tbl | |
101 | end | |
102 | ||
103 | -- down right, then from right corner to bottom, it's easier in 90's | |
104 | perc = perc - 45 -- remove the perc, this makes math easier later on | |
105 | if (perc > 90) then | |
106 | insert(tbl, {x = x + w, y = y + h, u = 1, v = 1}) | |
107 | else | |
108 | insert(tbl, {x = x + w, y = y - h + perc / 90 * h * 2, u = 1, v = clamp(perc / 90)}) return tbl | |
109 | end | |
110 | ||
111 | -- down left, then from right to left | |
112 | perc = perc - 90 | |
113 | if (perc > 90) then | |
114 | insert(tbl, {x = x - w, y = y + h, u = 0, v = 1}) | |
115 | else | |
116 | insert(tbl, {x = x + w - perc / 90 * h * 2, y = y + h, u = 1 - clamp(perc / 90), v = 1}) return tbl | |
117 | end | |
118 | ||
119 | -- top left, and from bottom to up! | |
120 | perc = perc - 90 | |
121 | if (perc > 90) then | |
122 | insert(tbl, {x = x - w, y = y - h, u = 0, v = 0}) | |
123 | else | |
124 | insert(tbl, {x = x - w, y = y + h - perc / 90 * h * 2, u = 0, v = 1 - clamp(perc / 90)}) return tbl | |
125 | end | |
126 | ||
127 | -- top center, now go back to close our pizza up. We dont need to do an if here, as this is the last peice of this godly meal. | |
128 | perc = perc - 90 | |
129 | insert(tbl, {x = x - w + perc / 45 * w, y = y - h, u = clamp(perc / 45) / 2, v = 0}) | |
130 | ||
131 | -- aparently, we got a full pizza! lets return this lovly meal. | |
132 | return tbl | |
133 | end | |
134 | end | |
135 | ||
136 | function CreateBorderedCircle(x, y, size, border, perc, addrot, parts) | |
137 | ||
138 | local sin = math.sin | |
139 | local cos = math.cos | |
140 | local rad = math.rad | |
141 | ||
142 | local parts = parts or 100 | |
143 | ||
144 | local tbl = {} | |
145 | local onerad = rad(360) / parts | |
146 | local fixpos = rad(90) | |
147 | local ret = false | |
148 | local ending = perc * 3.6 * (parts / 360) | |
149 | local innersize = size - border | |
150 | local i = 0 | |
151 | ||
152 | if (addrot != nil) then | |
153 | fixpos = fixpos + rad(addrot) | |
154 | end | |
155 | ||
156 | while(true) do | |
157 | if (not ret) then | |
158 | -- outside | |
159 | table.insert(tbl, { | |
160 | x = x - cos(i * onerad - fixpos) * innersize, | |
161 | y = y + sin(i * onerad - fixpos) * innersize | |
162 | }) | |
163 | ||
164 | i = i + 1 | |
165 | ||
166 | if (i > ending) then | |
167 | ret = true | |
168 | i = i - 1 | |
169 | end | |
170 | else | |
171 | -- inside | |
172 | table.insert(tbl, { | |
173 | x = x - cos(i * onerad - fixpos) * size, | |
174 | y = y + sin(i * onerad - fixpos) * size | |
175 | }) | |
176 | ||
177 | i = i - 1 | |
178 | ||
179 | if (i < 0) then | |
180 | table.insert(tbl, { | |
181 | x = x + cos(fixpos) * size, | |
182 | y = y + sin(fixpos) * size | |
183 | }) | |
184 | ||
185 | break | |
186 | end | |
187 | end | |
188 | end | |
189 | ||
190 | return tbl | |
191 | end | |
192 | ||
193 | function DrawCorrectFuckingPoly(tbl, fade) | |
194 | local len = #tbl | |
195 | ||
196 | for i = 1, #tbl do | |
197 | ||
198 | if fade and (i < 5 or i >= (len-5)) then | |
199 | local col = i / 5 | |
200 | ||
201 | if i > len/2 then | |
202 | col = (len-i-1) / 5 | |
203 | end | |
204 | ||
205 | surface.SetDrawColor( 175 * col, 225 * col, 100 * col, 200 * col ) | |
206 | elseif fade then | |
207 | surface.SetDrawColor( 175, 225, 100, 200 ) | |
208 | end | |
209 | ||
210 | surface.DrawPoly({tbl[i], tbl[len - (i - 1)], tbl[len - i]}) | |
211 | surface.DrawPoly({tbl[i], tbl[i + 1], tbl[len - i]}) | |
212 | end | |
213 | end | |
214 | ||
215 | local roundstate_string = { | |
216 | [ROUND_WAIT] = "round_wait", | |
217 | [ROUND_PREP] = "round_prep", | |
218 | [ROUND_ACTIVE] = "round_active", | |
219 | [ROUND_POST] = "round_post" | |
220 | } | |
221 | ||
222 | local role_string = { | |
223 | ["innocent"] = Color(170,225,100,200), | |
224 | ["traitor"] = Color(205,60,40,200), | |
225 | ["detective"] = Color(115,180,200,200), | |
226 | ["round"] = Color(200,200,200,200) | |
227 | } | |
228 | ||
229 | local role_string_2 = { | |
230 | ["innocent"] = Color(150,205,80,200), | |
231 | ["traitor"] = Color(180,40,20,200), | |
232 | ["detective"] = Color(95,160,180,200), | |
233 | ["round"] = Color(180,180,180,200) | |
234 | } | |
235 | ||
236 | local function GetAmmo() | |
237 | local ply = LocalPlayer() | |
238 | local weap = ply:GetActiveWeapon() | |
239 | if !IsValid(weap) or not ply:Alive() then return -1 end | |
240 | ||
241 | local ammo_inv = weap:Ammo1() or 0 | |
242 | local ammo_clip = weap:Clip1() or 0 | |
243 | local ammo_max = weap.Primary.ClipSize or 0 | |
244 | local ammo_invmax = weap.Primary.ClipMax or 0 | |
245 | ||
246 | return ammo_clip, ammo_max, ammo_inv, ammo_invmax | |
247 | end | |
248 | ||
249 | local GetPTranslation = LANG.GetParamTranslation | |
250 | local GetRaw = LANG.GetRawTranslation | |
251 | ||
252 | local key_params = {usekey = Key("+use", "USE"), walkkey = Key("+walk", "WALK")} | |
253 | ||
254 | local ClassHint = { | |
255 | prop_ragdoll = { | |
256 | name= "corpse", | |
257 | hint= "corpse_hint", | |
258 | ||
259 | fmt = function(ent, txt) return GetPTranslation(txt, key_params) end | |
260 | } | |
261 | }; | |
262 | ||
263 | ---- "T" indicator above traitors | |
264 | ||
265 | local indicator_mat = Material("VGUI/ttt/sprite_traitor") | |
266 | local indicator_col = Color(255, 255, 255, 130) | |
267 | ||
268 | local client, plys, ply, pos, dir, tgt | |
269 | local GetPlayers = player.GetAll | |
270 | ||
271 | local propspec_outline = Material("models/props_combine/portalball001_sheet") | |
272 | ||
273 | ||
274 | local function DrawPropSpecLabels(client) | |
275 | if (not client:IsSpec()) and (GetRoundState() != ROUND_POST) then return end | |
276 | ||
277 | surface.SetFont("TabLarge") | |
278 | ||
279 | local tgt = nil | |
280 | local scrpos = nil | |
281 | local text = nil | |
282 | local w = 0 | |
283 | for _, ply in pairs(player.GetAll()) do | |
284 | if ply:IsSpec() then | |
285 | surface.SetTextColor(220,200,0,120) | |
286 | ||
287 | tgt = ply:GetObserverTarget() | |
288 | ||
289 | if IsValid(tgt) and tgt:GetNWEntity("spec_owner", nil) == ply then | |
290 | ||
291 | scrpos = tgt:GetPos():ToScreen() | |
292 | else | |
293 | scrpos = nil | |
294 | end | |
295 | else | |
296 | local _, healthcolor = util.HealthToString(ply:Health()) | |
297 | surface.SetTextColor(clr(healthcolor)) | |
298 | ||
299 | scrpos = ply:EyePos() | |
300 | scrpos.z = scrpos.z + 20 | |
301 | ||
302 | scrpos = scrpos:ToScreen() | |
303 | end | |
304 | ||
305 | if scrpos and (not IsOffScreen(scrpos)) then | |
306 | text = ply:Nick() | |
307 | w, _ = surface.GetTextSize(text) | |
308 | ||
309 | surface.SetTextPos(scrpos.x - w / 2, scrpos.y) | |
310 | surface.DrawText(text) | |
311 | end | |
312 | end | |
313 | end | |
314 | ||
315 | ||
316 | ---- Crosshair affairs | |
317 | ||
318 | surface.CreateFont("TargetIDSmall2", {font = "TargetID", | |
319 | size = 16, | |
320 | weight = 1000}) | |
321 | ||
322 | local minimalist = CreateConVar("ttt_minimal_targetid", "0", FCVAR_ARCHIVE) | |
323 | ||
324 | local magnifier_mat = Material("icon16/magnifier.png") | |
325 | local ring_tex = surface.GetTextureID("effects/select_ring") | |
326 | ||
327 | local rag_color = Color(200,200,200,255) | |
328 | ||
329 | local GetLang = LANG.GetUnsafeLanguageTable | |
330 | ||
331 | if FC_HUD.DefaultTargetInfo == false then | |
332 | ||
333 | GAMEMODE.HUDDrawTargetID = function() | |
334 | local client = LocalPlayer() | |
335 | ||
336 | local L = GetLang() | |
337 | ||
338 | DrawPropSpecLabels(client) | |
339 | ||
340 | local trace = client:GetEyeTrace(MASK_SHOT) | |
341 | local ent = trace.Entity | |
342 | if (not IsValid(ent)) or ent.NoTarget then return end | |
343 | ||
344 | -- some bools for caching what kind of ent we are looking at | |
345 | local target_traitor = false | |
346 | local target_detective = false | |
347 | local target_corpse = false | |
348 | ||
349 | local text = nil | |
350 | local color = COLOR_WHITE | |
351 | ||
352 | -- if a vehicle, we identify the driver instead | |
353 | if IsValid(ent:GetNWEntity("ttt_driver", nil)) then | |
354 | ent = ent:GetNWEntity("ttt_driver", nil) | |
355 | ||
356 | if ent == client then return end | |
357 | end | |
358 | ||
359 | local cls = ent:GetClass() | |
360 | local minimal = minimalist:GetBool() | |
361 | local hint = (not minimal) and (ent.TargetIDHint or ClassHint[cls]) | |
362 | ||
363 | if ent:IsPlayer() then | |
364 | if ent:GetNWBool("disguised", false) then | |
365 | client.last_id = nil | |
366 | ||
367 | if client:IsTraitor() or client:IsSpec() then | |
368 | text = ent:Nick() .. L.target_disg | |
369 | else | |
370 | -- Do not show anything | |
371 | return | |
372 | end | |
373 | ||
374 | color = COLOR_RED | |
375 | else | |
376 | text = ent:Nick() | |
377 | client.last_id = ent | |
378 | end | |
379 | ||
380 | -- in minimalist targetID, colour nick with health level | |
381 | if minimal then | |
382 | _, color = util.HealthToString(ent:Health()) | |
383 | end | |
384 | ||
385 | if client:IsTraitor() and GAMEMODE.round_state == ROUND_ACTIVE then | |
386 | target_traitor = ent:IsTraitor() | |
387 | end | |
388 | ||
389 | target_detective = ent:IsDetective() | |
390 | ||
391 | elseif cls == "prop_ragdoll" then | |
392 | -- only show this if the ragdoll has a nick, else it could be a mattress | |
393 | if CORPSE.GetPlayerNick(ent, false) == false then return end | |
394 | ||
395 | target_corpse = true | |
396 | ||
397 | if CORPSE.GetFound(ent, false) or not DetectiveMode() then | |
398 | text = CORPSE.GetPlayerNick(ent, "A Terrorist") | |
399 | else | |
400 | text = L.target_unid | |
401 | color = COLOR_YELLOW | |
402 | end | |
403 | elseif not hint then | |
404 | -- Not something to ID and not something to hint about | |
405 | return | |
406 | end | |
407 | ||
408 | local x_orig = ScrW() / 2.0 | |
409 | local x = x_orig | |
410 | local y = ScrH() / 2.0 | |
411 | ||
412 | local w, h = 0,0 -- text width/height, reused several times | |
413 | ||
414 | if target_traitor or target_detective then | |
415 | surface.SetTexture(ring_tex) | |
416 | ||
417 | if target_traitor then | |
418 | surface.SetDrawColor(255, 0, 0, 200) | |
419 | else | |
420 | surface.SetDrawColor(0, 0, 255, 220) | |
421 | end | |
422 | surface.DrawTexturedRect(x-32, y-32, 64, 64) | |
423 | end | |
424 | ||
425 | y = y + 30 | |
426 | local font = "FC_HUD_20" | |
427 | surface.SetFont( font ) | |
428 | ||
429 | -- Draw main title, ie. nickname | |
430 | if text then | |
431 | w1, h1 = surface.GetTextSize( string.upper(text) ) | |
432 | w2, h2 = surface.GetTextSize( string.upper(text) ) | |
433 | ||
434 | x = x - w1 / 2 | |
435 | ||
436 | local width = w1 + 32 | |
437 | ||
438 | surface.SetDrawColor( 0, 0, 0, 200 ) | |
439 | surface.SetMaterial( FC_HUD.White ) | |
440 | ||
441 | local tab = CreateBorderedCircle((ScrW()-width)/2 + 14, ScrH()/2 + 30 + 14, 10, 10, 100, 0, 20) | |
442 | DrawCorrectFuckingPoly(tab) | |
443 | ||
444 | if ent:IsPlayer() then | |
445 | if LocalPlayer():IsTraitor() and ent:IsTraitor() then | |
446 | surface.SetDrawColor( role_string["traitor"] ) | |
447 | elseif ent:IsDetective() then | |
448 | surface.SetDrawColor( role_string["detective"] ) | |
449 | else | |
450 | surface.SetDrawColor( role_string["innocent"] ) | |
451 | end | |
452 | else | |
453 | surface.SetDrawColor( role_string["round"] ) | |
454 | end | |
455 | ||
456 | local tab = CreateBorderedCircle((ScrW()-width)/2 + 14, ScrH()/2 + 30 + 14, 8, 8, 100, 0, 20) | |
457 | DrawCorrectFuckingPoly(tab) | |
458 | ||
459 | ||
460 | draw.RoundedBox(2, (ScrW()-width)/2 + 26, ScrH()/2 + 34, w1 + 4, h1, Color(0,0,0,200)) | |
461 | draw.SimpleText( string.upper(text), "FC_HUD_20", (ScrW()-width)/2 + 28, ScrH()/2 + 44, color, TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER ) | |
462 | ||
463 | -- for ragdolls searched by detectives, add icon | |
464 | /*if ent.search_result and client:IsDetective() then | |
465 | -- if I am detective and I know a search result for this corpse, then I | |
466 | -- have searched it or another detective has | |
467 | surface.SetMaterial(magnifier_mat) | |
468 | surface.SetDrawColor(200, 200, 255, 255) | |
469 | surface.DrawTexturedRect(x + w + 5, y, 16, 16) | |
470 | end*/ | |
471 | ||
472 | y = y + h + 4 | |
473 | end | |
474 | ||
475 | -- Minimalist target ID only draws a health-coloured nickname, no hints, no | |
476 | -- karma, no tag | |
477 | if minimal then return end | |
478 | ||
479 | ||
480 | -- Draw subtitle: health or type | |
481 | local clr = rag_color | |
482 | if ent:IsPlayer() then | |
483 | text, clr = util.HealthToString(ent:Health()) | |
484 | ||
485 | -- HealthToString returns a string id, need to look it up | |
486 | text = L[text] | |
487 | elseif hint then | |
488 | text = GetRaw(hint.name) or hint.name | |
489 | else | |
490 | return | |
491 | end | |
492 | font = "TargetIDSmall2" | |
493 | ||
494 | surface.SetFont( font ) | |
495 | w, h = surface.GetTextSize( text ) | |
496 | x = x_orig - w / 2 | |
497 | ||
498 | //draw.SimpleText( text, font, x+1, y+1, COLOR_BLACK ) | |
499 | //draw.SimpleText( text, font, x, y, clr ) | |
500 | ||
501 | font = "TargetIDSmall" | |
502 | surface.SetFont( font ) | |
503 | ||
504 | local h_karma, h_hint, h_karma_color, h_hint_color = "", "", Color(255,255,255,200), Color(255,255,255,200) | |
505 | ||
506 | -- Draw second subtitle: karma | |
507 | if ent:IsPlayer() and KARMA.IsEnabled() then | |
508 | text, clr = util.KarmaToString(ent:GetBaseKarma()) | |
509 | ||
510 | text = L[text] | |
511 | ||
512 | w, h = surface.GetTextSize( text ) | |
513 | y = y + h + 5 | |
514 | x = x_orig - w / 2 | |
515 | ||
516 | h_karma = text | |
517 | h_karma_color = clr | |
518 | end | |
519 | ||
520 | -- Draw key hint | |
521 | if hint and hint.hint then | |
522 | if not hint.fmt then | |
523 | text = GetRaw(hint.hint) or hint.hint | |
524 | else | |
525 | text = hint.fmt(ent, hint.hint) | |
526 | end | |
527 | ||
528 | w, h = surface.GetTextSize(text) | |
529 | x = x_orig - w / 2 | |
530 | y = y + h + 5 | |
531 | h_hint = text | |
532 | elseif ent:IsPlayer() and ent.sb_tag then | |
533 | h_hint = LANG.GetTranslation(ent.sb_tag.txt) or "" | |
534 | h_hint_color = ent.sb_tag.color | |
535 | end | |
536 | ||
537 | surface.SetFont( "FC_HUD_20" ) | |
538 | ||
539 | w1, h1 = surface.GetTextSize( string.upper(h_karma) ) | |
540 | w2, h2 = surface.GetTextSize( string.upper(h_hint) ) | |
541 | ||
542 | local addw, addh = 0, 0 | |
543 | ||
544 | if ent:IsPlayer() and ent:Alive() then | |
545 | addw = 48 | |
546 | addh = 24 | |
547 | ||
548 | if FC_HUD.ShowOnlyHP then w1, w2 = -4, -4 end | |
549 | end | |
550 | ||
551 | local width = math.max(w1, w2) + 4 + addw | |
552 | ||
553 | draw.RoundedBox(2, (ScrW()-width)/2, ScrH()/2 + 58, width, 24 + addh, Color(0,0,0,200)) | |
554 | ||
555 | if ent:IsPlayer() and ent:Alive() then | |
556 | ||
557 | local y1,y2 = ScrH()/2 + 70, ScrH()/2 + 94 | |
558 | ||
559 | if h_karma == "" then y2 = ScrH()/2 + 82 end | |
560 | if h_hint == "" then y1 = ScrH()/2 + 82 end | |
561 | ||
562 | if !FC_HUD.ShowOnlyHP then | |
563 | ||
564 | draw.SimpleText( string.upper(h_karma), "FC_HUD_20", (ScrW()-width)/2 + 48, y1, h_karma_color, TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER ) | |
565 | draw.SimpleText( string.upper(h_hint), "FC_HUD_20", (ScrW()-width)/2 + 48, y2, h_hint_color, TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER ) | |
566 | ||
567 | end | |
568 | ||
569 | surface.SetDrawColor( 255, 0, 0, 200 ) | |
570 | surface.SetMaterial( FC_HUD.White ) | |
571 | ||
572 | local parts = NiceUV((ScrW()-width)/2 + 24, ScrH()/2 + 82, 32, 32, math.Clamp(ent:Health(), 0, 100) / 100 * 360, true ) | |
573 | ||
574 | surface.SetMaterial( FC_HUD.SmallHP ) | |
575 | if FC_HUD.TeamBasedHP and (target_traitor or target_detective) then | |
576 | if target_traitor then | |
577 | surface.SetDrawColor( role_string["traitor"] ) | |
578 | else | |
579 | surface.SetDrawColor( role_string["detective"] ) | |
580 | end | |
581 | else | |
582 | surface.SetDrawColor( role_string["innocent"] ) | |
583 | end | |
584 | surface.SetDrawColor(160, 205, 95, 200) | |
585 | surface.DrawPoly(parts) | |
586 | ||
587 | if ent:Armor() > 0 then | |
588 | ||
589 | local parts = NiceUV((ScrW()-width)/2 + 24, ScrH()/2 + 82, 32, 32, math.Clamp(ent:Armor(), 0, 100) / 100 * 360, true ) | |
590 | ||
591 | surface.SetMaterial( FC_HUD.SmallAR ) | |
592 | surface.SetDrawColor(255,255,255,200) | |
593 | surface.DrawPoly(parts) | |
594 | ||
595 | end | |
596 | ||
597 | else | |
598 | draw.SimpleText( string.upper(h_hint), "FC_HUD_20", ScrW()/2, ScrH()/2 + 70, h_hint_color, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER ) | |
599 | end | |
600 | ||
601 | text = nil | |
602 | ||
603 | ||
604 | end | |
605 | ||
606 | end | |
607 | ||
608 | local delay = 0.075 | |
609 | local showtime = 3 | |
610 | ||
611 | local margin = 10 | |
612 | local width = 350 | |
613 | local height = 22 | |
614 | ||
615 | local barcorner = surface.GetTextureID( "gui/corner8" ) | |
616 | ||
617 | local col_active = { | |
618 | tip = { | |
619 | [ROLE_INNOCENT] = role_string["innocent"], | |
620 | [ROLE_TRAITOR] = role_string["traitor"], | |
621 | [ROLE_DETECTIVE] = role_string["detective"] | |
622 | }, | |
623 | ||
624 | bg = Color(0, 0, 0, 250), | |
625 | ||
626 | text_empty = Color(200, 20, 20, 255), | |
627 | text_empty_2 = Color(200, 200, 20, 255), | |
628 | text = Color(255, 255, 255, 255), | |
629 | ||
630 | shadow = 255 | |
631 | }; | |
632 | ||
633 | local col_dark = { | |
634 | tip = { | |
635 | [ROLE_INNOCENT] = role_string_2["innocent"], | |
636 | [ROLE_TRAITOR] = role_string_2["traitor"], | |
637 | [ROLE_DETECTIVE] = role_string_2["detective"] | |
638 | }, | |
639 | ||
640 | bg = Color(0, 0, 0, 200), | |
641 | ||
642 | text_empty = Color(200, 20, 20, 100), | |
643 | text_empty_2 = Color(200, 200, 20, 100), | |
644 | text = Color(255, 255, 255, 100), | |
645 | ||
646 | shadow = 100 | |
647 | }; | |
648 | ||
649 | -- Draw a bar in the style of the the weapon pickup ones | |
650 | local round = math.Round | |
651 | function WSWITCH:DrawBarBg(x, y, w, h, col) | |
652 | draw.RoundedBoxEx( 2, x + 20, y - 15, w - 20, 30, col.bg, false, true, false, true ) | |
653 | draw.RoundedBoxEx( 2, x, y - 15, 20, 30, Color(255,255,255,200), true, false, true, false ) | |
654 | end | |
655 | ||
656 | local TryTranslation = LANG.TryTranslation | |
657 | function WSWITCH:DrawWeapon(x, y, c, wep) | |
658 | if not IsValid(wep) then return false end | |
659 | ||
660 | local name = TryTranslation(wep:GetPrintName() or wep.PrintName or "...") | |
661 | local cl1, am1 = wep:Clip1(), wep:Ammo1() | |
662 | local ammo = false | |
663 | ||
664 | -- Clip1 will be -1 if a melee weapon | |
665 | -- Ammo1 will be false if weapon has no owner (was just dropped) | |
666 | if cl1 != -1 and am1 != false then | |
667 | ammo = Format("%i + %02i", cl1, am1) | |
668 | end | |
669 | ||
670 | -- Slot | |
671 | local spec = {text=wep.Slot+1, font="FC_HUD_30", pos={x+4, y}, yalign=TEXT_ALIGN_CENTER, yalign=TEXT_ALIGN_CENTER, color=c.text} | |
672 | ||
673 | draw.SimpleText( wep.Slot + 1, "FC_HUD_30", x+10, y, Color(0,0,0,200), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER) | |
674 | ||
675 | -- Name | |
676 | spec.text = string.upper(name) | |
677 | spec.pos[1] = x + 10 + height | |
678 | draw.Text(spec) | |
679 | ||
680 | local clip, max, inv, invmax = wep:Clip1() or 0, wep.Primary.ClipSize or 0, wep:Ammo1() or 0, wep.ClipMax or 0 | |
681 | ||
682 | if clip != -1 then | |
683 | local col1, col2 = c.text, c.text | |
684 | ||
685 | if clip == 0 then | |
686 | col1 = c.text_empty | |
687 | elseif clip/max <= 0.25 then | |
688 | col1 = c.text_empty_2 | |
689 | end | |
690 | ||
691 | if inv == 0 then | |
692 | col2 = c.text_empty | |
693 | elseif inv/invmax <= 0.25 then | |
694 | col2 = c.text_empty_2 | |
695 | end | |
696 | ||
697 | if clip < 10 then | |
698 | clip = "0"..clip | |
699 | end | |
700 | ||
701 | if inv < 10 then | |
702 | inv = "0"..inv | |
703 | end | |
704 | ||
705 | local w, h = draw.SimpleText(inv, "FC_HUD_30", ScrW() - margin*3, y, col2, TEXT_ALIGN_RIGHT, TEXT_ALIGN_CENTER) | |
706 | local w2, h2 = draw.SimpleText("+", "FC_HUD_30", ScrW() - margin*3 - w - 4, y, c.text, TEXT_ALIGN_RIGHT, TEXT_ALIGN_CENTER) | |
707 | draw.SimpleText(clip, "FC_HUD_30", ScrW() - margin*3 - w - w2 - 8, y, col1, TEXT_ALIGN_RIGHT, TEXT_ALIGN_CENTER) | |
708 | ||
709 | end | |
710 | ||
711 | return true | |
712 | end | |
713 | ||
714 | function WSWITCH:Draw(client) | |
715 | if not self.Show then return end | |
716 | ||
717 | local weps = self.WeaponCache | |
718 | ||
719 | local x = ScrW() - width - margin*2 | |
720 | local y = ScrH() - (#weps * (height + margin)) | |
721 | ||
722 | local col = col_dark | |
723 | for k, wep in pairs(weps) do | |
724 | if self.Selected == k then | |
725 | col = col_active | |
726 | else | |
727 | col = col_dark | |
728 | end | |
729 | ||
730 | self:DrawBarBg(x, y, width, height, col) | |
731 | if not self:DrawWeapon(x, y, col, wep) then | |
732 | ||
733 | self:UpdateWeaponCache() | |
734 | return | |
735 | end | |
736 | ||
737 | y = y + height + margin | |
738 | end | |
739 | end | |
740 | ||
741 | function GAMEMODE:HUDDrawPickupHistory() | |
742 | if (GAMEMODE.PickupHistory == nil) then return end | |
743 | ||
744 | local x, y = ScrW() - GAMEMODE.PickupHistoryWide - 20, GAMEMODE.PickupHistoryTop | |
745 | local tall = 0 | |
746 | local wide = 0 | |
747 | ||
748 | for k, v in pairs( GAMEMODE.PickupHistory ) do | |
749 | ||
750 | if v.time < CurTime() then | |
751 | ||
752 | if (v.y == nil) then v.y = y end | |
753 | ||
754 | v.x = x | |
755 | v.y = (v.y*5 + y) / 6 | |
756 | ||
757 | local delta = (v.time + v.holdtime) - CurTime() | |
758 | delta = delta / v.holdtime | |
759 | delta = math.Clamp( delta, 0, 1 ) | |
760 | ||
761 | local nam = v.name | |
762 | ||
763 | if v.amount then | |
764 | nam = v.name.." ["..v.amount.."]" | |
765 | end | |
766 | ||
767 | nam = string.upper(nam) | |
768 | ||
769 | surface.SetFont("FC_HUD_20") | |
770 | local fw, fh = surface.GetTextSize(v.name) | |
771 | local fw2 = 0 | |
772 | ||
773 | if v.amount then | |
774 | fw2 = surface.GetTextSize(" ["..v.amount.."]") | |
775 | fw = fw + fw2 | |
776 | end | |
777 | ||
778 | local clampw = 0 | |
779 | local al = 0 | |
780 | ||
781 | if delta >= 0.85 then | |
782 | clampw = 0 | |
783 | elseif delta < 0.85 and delta > 0.8 then | |
784 | clampw = fw * ( 1 - ((delta - 0.8)*20) ) | |
785 | elseif delta > 0.2 then | |
786 | clampw = fw * 1 | |
787 | elseif delta <= 0.2 and delta > 0.15 then | |
788 | clampw = fw * ((delta - 0.15)*20) | |
789 | elseif delta <= 0.1 then | |
790 | clampw = 0 | |
791 | end | |
792 | ||
793 | if delta > 0.9 then | |
794 | al = 1 - ((delta - 0.9) * 10) | |
795 | elseif delta < 0.1 then | |
796 | al = (delta) * 10 | |
797 | else | |
798 | al = 1 | |
799 | end | |
800 | ||
801 | local boxw = math.max( clampw, 0 ) | |
802 | ||
803 | draw.RoundedBox( 0, ScrW() - 40 - boxw, v.y - 18, boxw + 20, 24, Color(0,0,0,200 * al) ) | |
804 | ||
805 | draw.RoundedBox( 0, ScrW() - 40 - boxw, v.y - 18, 6, 2, Color(255,255,255,200 * al) ) | |
806 | draw.RoundedBox( 0, ScrW() - 40 - boxw, v.y - 16, 2, 4, Color(255,255,255,200 * al) ) | |
807 | ||
808 | draw.RoundedBox( 0, ScrW() - 40 - boxw, v.y + 4, 6, 2, Color(255,255,255,200 * al) ) | |
809 | draw.RoundedBox( 0, ScrW() - 40 - boxw, v.y, 2, 4, Color(255,255,255,200 * al) ) | |
810 | ||
811 | draw.RoundedBox( 0, ScrW() - 26, v.y - 18, 6, 2, Color(255,255,255,200 * al) ) | |
812 | draw.RoundedBox( 0, ScrW() - 22, v.y - 16, 2, 4, Color(255,255,255,200 * al) ) | |
813 | ||
814 | draw.RoundedBox( 0, ScrW() - 26, v.y + 4, 6, 2, Color(255,255,255,200 * al) ) | |
815 | draw.RoundedBox( 0, ScrW() - 22, v.y, 2, 4, Color(255,255,255,200 * al) ) | |
816 | ||
817 | render.SetScissorRect( ScrW() - 40 - boxw + 10, v.y - 18, ScrW() - 30, v.y + 6, true ) | |
818 | draw.SimpleText( v.name, "FC_HUD_20", ScrW() - 30 - fw2, v.y - (v.height/2), Color( 255, 255, 255, 200 * al ), TEXT_ALIGN_RIGHT, TEXT_ALIGN_CENTER ) | |
819 | if v.amount then | |
820 | draw.SimpleText( " ["..v.amount.."]", "FC_HUD_20", ScrW() - 30, v.y - (v.height/2), Color( 255, 255, 255, 200 * al ), TEXT_ALIGN_RIGHT, TEXT_ALIGN_CENTER ) | |
821 | end | |
822 | render.SetScissorRect( ScrW() - 40 - boxw, v.y - 18, boxw, 24, false ) | |
823 | ||
824 | y = y + (v.height + 16) | |
825 | tall = tall + v.height + 18 | |
826 | wide = math.Max( wide, v.width + v.height + 24 ) | |
827 | ||
828 | if delta == 0 then GAMEMODE.PickupHistory[k] = nil end | |
829 | end | |
830 | end | |
831 | ||
832 | GAMEMODE.PickupHistoryTop = (GAMEMODE.PickupHistoryTop * 5 + ( ScrH() * 0.75 - tall ) / 2 ) / 6 | |
833 | GAMEMODE.PickupHistoryWide = (GAMEMODE.PickupHistoryWide * 5 + wide) / 6 | |
834 | end | |
835 | ||
836 | GAMEMODE.HUDPaint = function() | |
837 | local client = LocalPlayer() | |
838 | ||
839 | GAMEMODE:HUDDrawTargetID() | |
840 | ||
841 | MSTACK:Draw(client) | |
842 | ||
843 | if (not client:Alive()) or client:Team() == TEAM_SPEC then | |
844 | return | |
845 | end | |
846 | ||
847 | ||
848 | RADAR:Draw(client) | |
849 | TBHUD:Draw(client) | |
850 | WSWITCH:Draw(client) | |
851 | ||
852 | VOICE.Draw(client) | |
853 | DISGUISE.Draw(client) | |
854 | ||
855 | GAMEMODE:HUDDrawPickupHistory() | |
856 | end | |
857 | ||
858 | hook.Add("HUDPaint", "FC_HUD", function() | |
859 | ||
860 | local y = ScrH() | |
861 | local L = LANG.GetUnsafeLanguageTable() | |
862 | ||
863 | ||
864 | local is_haste = HasteMode() and GetRoundState() == ROUND_ACTIVE | |
865 | local is_traitor = LocalPlayer():IsTraitor() or !LocalPlayer():Alive() | |
866 | ||
867 | local endtime = GetGlobalFloat("ttt_round_end", 0) - CurTime() | |
868 | ||
869 | local overtime = false | |
870 | local text | |
871 | local color = Color(255,255,255,200) | |
872 | ||
873 | -- Time displays differently depending on whether haste mode is on, | |
874 | -- whether the player is traitor or not, and whether it is overtime. | |
875 | if is_haste then | |
876 | local hastetime = GetGlobalFloat("ttt_haste_end", 0) - CurTime() | |
877 | if hastetime < 0 then | |
878 | if (not is_traitor) or (math.ceil(CurTime()) % 7 <= 2) then | |
879 | -- innocent or blinking "overtime" | |
880 | text = L.overtime | |
881 | overtime = true | |
882 | else | |
883 | -- traitor and not blinking "overtime" right now, so standard endtime display | |
884 | text = string.ToMinutesSeconds(math.max(0, endtime)) | |
885 | color = Color(255,0,0,200) | |
886 | end | |
887 | else | |
888 | -- still in starting period | |
889 | local t = hastetime | |
890 | if is_traitor and math.ceil(CurTime()) % 6 < 2 then | |
891 | t = endtime | |
892 | color = Color(255,0,0,200) | |
893 | end | |
894 | text = string.ToMinutesSeconds(math.max(0, t)) | |
895 | end | |
896 | else | |
897 | -- bog standard time when haste mode is off (or round not active) | |
898 | text = string.ToMinutesSeconds(math.max(0, endtime)) | |
899 | end | |
900 | ||
901 | ||
902 | if LocalPlayer():Alive() and LocalPlayer():Team() != TEAM_SPECTATOR and GetRoundState() != ROUND_WAIT then | |
903 | ||
904 | draw.RoundedBox(2, 20, y - 114, 94, 94, Color(0,0,0,200)) | |
905 | ||
906 | if FC_HUD.LastHP == nil then FC_HUD.LastHP = LocalPlayer():Health() end | |
907 | ||
908 | if LocalPlayer():Health() != FC_HUD.LastHP then | |
909 | ||
910 | local tab = {} | |
911 | tab.time = CurTime() + 0.5 | |
912 | tab.last = FC_HUD.LastHP | |
913 | tab.new = LocalPlayer():Health() | |
914 | ||
915 | table.insert(FC_HUD.HPFallout, tab) | |
916 | ||
917 | print("NEW", FC_HUD.LastHP, LocalPlayer():Health()) | |
918 | end | |
919 | ||
920 | for k, v in pairs(FC_HUD.HPFallout) do | |
921 | ||
922 | if CurTime() >= v.time then | |
923 | FC_HUD.HPFallout[k] = nil | |
924 | continue | |
925 | end | |
926 | ||
927 | local parts = NiceUV(67, y - 67, 64, 64, math.Clamp(v.last, 0, 100) / 100 * 360, true ) | |
928 | ||
929 | local alpha = (v.time - CurTime()) * 510 | |
930 | ||
931 | surface.SetMaterial( FC_HUD.BigHP ) | |
932 | surface.SetDrawColor( 205, 0, 0, alpha ) | |
933 | surface.DrawPoly(parts) | |
934 | ||
935 | end | |
936 | ||
937 | FC_HUD.LastHP = LocalPlayer():Health() | |
938 | ||
939 | surface.SetDrawColor( 255, 0, 0, 200 ) | |
940 | surface.SetMaterial( FC_HUD.White ) | |
941 | ||
942 | local parts = NiceUV(67, y - 67, 64, 64, math.Clamp(LocalPlayer():Health(), 0, 100) / 100 * 360, true ) | |
943 | ||
944 | surface.SetMaterial( FC_HUD.BigHP ) | |
945 | ||
946 | if FC_HUD.TeamBasedHP then | |
947 | surface.SetDrawColor( role_string[string.lower(LocalPlayer():GetRoleString())] or role_string["innocent"]) | |
948 | else | |
949 | if LocalPlayer():Health() >= 25 then | |
950 | surface.SetDrawColor(role_string["innocent"]) | |
951 | else | |
952 | surface.SetDrawColor(role_string["traitor"]) | |
953 | end | |
954 | end | |
955 | ||
956 | surface.DrawPoly(parts) | |
957 | ||
958 | if LocalPlayer():HasEquipment(EQUIP_ARMOR) then | |
959 | ||
960 | local parts = NiceUV(67, y - 67, 64, 64, 360, true ) | |
961 | ||
962 | surface.SetMaterial( FC_HUD.BigAR ) | |
963 | surface.SetDrawColor(255, 255, 255, 200) | |
964 | surface.DrawPoly(parts) | |
965 | ||
966 | end | |
967 | ||
968 | draw.SimpleText(LocalPlayer():Health(), "FC_HUD_40", 67, y - 67, Color(255,255,255,200), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER) | |
969 | ||
970 | draw.RoundedBoxEx(2, 118, y - 114, 20, 30, Color(255,255,255,200), true, false, true, false) | |
971 | draw.RoundedBoxEx(2, 138, y - 114, 120, 30, Color(0,0,0,200), false, true, false, true) | |
972 | ||
973 | surface.SetMaterial( FC_HUD.White ) | |
974 | local tab = CreateBorderedCircle(128, y - 99, 8, 8, 85, 0, 10) | |
975 | surface.SetDrawColor( 0, 0, 0, 200 ) | |
976 | surface.SetMaterial( FC_HUD.White ) | |
977 | DrawCorrectFuckingPoly(tab) | |
978 | ||
979 | draw.SimpleText(text, "FC_HUD_30", 198, y - 99, color, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER) | |
980 | ||
981 | local y2 = 0 | |
982 | ||
983 | //if LocalPlayer():IsActiveTraitor() or LocalPlayer():IsActiveDetective() then | |
984 | draw.RoundedBoxEx(2, 138, y - 82 + y2, 120, 30, Color(0,0,0,200), false, true, false, true) | |
985 | draw.RoundedBoxEx(2, 118, y - 82 + y2, 20, 30, Color(255,255,255,200), true, false, true, false) | |
986 | draw.SimpleText("$", "FC_HUD_20", 128, y - 67 + y2, Color(0,0,0,200), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER) | |
987 | ||
988 | local cred = LocalPlayer():GetCredits() | |
989 | ||
990 | draw.SimpleText(cred.." CREDITS", "FC_HUD_30", 198, y - 67 + y2, Color(255,255,255,200), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER) | |
991 | y2 = 32 | |
992 | //end | |
993 | local clip, max, inv, invmax = GetAmmo() | |
994 | ||
995 | if clip != -1 then | |
996 | draw.RoundedBoxEx(2, 138, y - 82 + y2, 120, 30, Color(0,0,0,200), false, true, false, true) | |
997 | ||
998 | local col1, col2 = Color(255,255,255,200), Color(255,255,255,200) | |
999 | ||
1000 | if clip == 0 then | |
1001 | col1 = Color(200,20,20,200) | |
1002 | elseif clip/max <= 0.25 then | |
1003 | col1 = Color(200,200,20,200) | |
1004 | end | |
1005 | ||
1006 | if inv == 0 then | |
1007 | col2 = Color(200,20,20,200) | |
1008 | elseif inv/invmax <= 0.25 then | |
1009 | col2 = Color(200,200,20,200) | |
1010 | end | |
1011 | ||
1012 | if clip < 10 then | |
1013 | clip = "0"..clip | |
1014 | end | |
1015 | ||
1016 | if inv < 10 then | |
1017 | inv = "0"..inv | |
1018 | end | |
1019 | ||
1020 | draw.SimpleText("+", "FC_HUD_30", 198, y - 67 + y2, Color(255,255,255,200), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER) | |
1021 | draw.SimpleText(clip, "FC_HUD_30", 198 - 8, y - 67 + y2, col1, TEXT_ALIGN_RIGHT, TEXT_ALIGN_CENTER) | |
1022 | draw.SimpleText(inv, "FC_HUD_30", 198 + 10, y - 67 + y2, col2, TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER) | |
1023 | ||
1024 | draw.RoundedBoxEx(2, 118, y - 82 + y2, 20, 30, Color(255,255,255,200), true, false, true, false) | |
1025 | ||
1026 | surface.SetDrawColor( 0, 0, 0, 200 ) | |
1027 | surface.SetMaterial( FC_HUD.White ) | |
1028 | local tab = CreateBorderedCircle(128, y - 67 + y2, 8, 8, 100, 0, 10) | |
1029 | surface.SetMaterial( FC_HUD.White ) | |
1030 | DrawCorrectFuckingPoly(tab) | |
1031 | ||
1032 | draw.RoundedBox(0, 126, y - 75 + y2, 4, 16, Color(255,255,255,200)) | |
1033 | draw.RoundedBox(0, 120, y - 69 + y2, 16, 4, Color(255,255,255,200)) | |
1034 | end | |
1035 | ||
1036 | y = y - 130 | |
1037 | ||
1038 | else | |
1039 | ||
1040 | surface.SetFont("FC_HUD_20") | |
1041 | ||
1042 | local text = "" | |
1043 | local punch = false | |
1044 | local w, h = surface.GetTextSize( text ) | |
1045 | w = w + 16 | |
1046 | ||
1047 | local tgt = LocalPlayer():GetObserverTarget() | |
1048 | ||
1049 | if IsValid(tgt) and tgt:IsPlayer() then | |
1050 | ||
1051 | text = string.upper(tgt:Nick()) | |
1052 | w, h = surface.GetTextSize( text ) | |
1053 | w = w + 16 | |
1054 | elseif IsValid(tgt) and tgt:GetNWEntity("spec_owner", nil) == LocalPlayer() then | |
1055 | punch = true | |
1056 | text = string.upper((LANG.GetUnsafeLanguageTable().punch_title or "PUNCH-O-METER")) | |
1057 | w, h = surface.GetTextSize( text ) | |
1058 | w = w + 16 | |
1059 | else | |
1060 | text = string.upper(string.Interp(LANG.GetUnsafeLanguageTable().spec_help, { usekey = Key("+use", "USE") })) | |
1061 | w, h = surface.GetTextSize( text ) | |
1062 | w = w + 16 | |
1063 | end | |
1064 | ||
1065 | draw.RoundedBox(0, ScrW()/2 - w/2, 20, w, 30, Color(0,0,0,200)) | |
1066 | ||
1067 | draw.RoundedBox(0, ScrW()/2 - w/2 + 2, 20, 6, 2, Color(255,255,255,200)) | |
1068 | draw.RoundedBox(0, ScrW()/2 - w/2, 20, 2, 8, Color(255,255,255,200)) | |
1069 | ||
1070 | draw.RoundedBox(0, ScrW()/2 - w/2 + 2, 48, 6, 2, Color(255,255,255,200)) | |
1071 | draw.RoundedBox(0, ScrW()/2 - w/2, 42, 2, 8, Color(255,255,255,200)) | |
1072 | ||
1073 | draw.RoundedBox(0, ScrW()/2 + w/2 - 8, 20, 6, 2, Color(255,255,255,200)) | |
1074 | draw.RoundedBox(0, ScrW()/2 + w/2 - 2, 20, 2, 8, Color(255,255,255,200)) | |
1075 | ||
1076 | draw.RoundedBox(0, ScrW()/2 + w/2 - 8, 48, 6, 2, Color(255,255,255,200)) | |
1077 | draw.RoundedBox(0, ScrW()/2 + w/2 - 2, 42, 2, 8, Color(255,255,255,200)) | |
1078 | ||
1079 | if punch then | |
1080 | punches = LocalPlayer():GetNWFloat("specpunches", 0) | |
1081 | ||
1082 | local w2 = (w-4) * punches | |
1083 | ||
1084 | render.SetScissorRect( ScrW()/2 - w/2, 20, ScrW()/2 - w/2 + w2, 50, true ) | |
1085 | draw.RoundedBox( 0, ScrW()/2 - w/2 + 4, 24, w - 8, 22, Color(255,255,255,200) ) | |
1086 | draw.SimpleText( text, "FC_HUD_20", ScrW()/2, 35, Color(0,0,0,200), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER ) | |
1087 | render.SetScissorRect( ScrW()/2 - w/2, 20, 0, 50, false ) | |
1088 | ||
1089 | render.SetScissorRect( ScrW()/2 - w/2 + w2, 20, ScrW()/2 + w/2 - 4, 50, true ) | |
1090 | draw.SimpleText( text, "FC_HUD_20", ScrW()/2, 35, Color(255,255,255,200), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER ) | |
1091 | render.SetScissorRect( ScrW()/2 - w/2, 20, 0, 50, false ) | |
1092 | ||
1093 | else | |
1094 | draw.SimpleText( text, "FC_HUD_20", ScrW()/2, 35, Color(255,255,255,200), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER ) | |
1095 | end | |
1096 | ||
1097 | y = y - 30 | |
1098 | ||
1099 | end | |
1100 | ||
1101 | local t = "" | |
1102 | local col = role_string["round"] | |
1103 | ||
1104 | if GetRoundState() == ROUND_WAIT or LocalPlayer():Alive() == false or LocalPlayer():Team() == TEAM_SPECTATOR then | |
1105 | ||
1106 | else | |
1107 | text = "" | |
1108 | end | |
1109 | ||
1110 | if GetRoundState() == ROUND_ACTIVE and LocalPlayer():Alive() and LocalPlayer():Team() != TEAM_SPECTATOR then | |
1111 | t = L[ LocalPlayer():GetRoleStringRaw() ] | |
1112 | col = role_string[ LocalPlayer():GetRoleStringRaw() ] | |
1113 | text = "" | |
1114 | else | |
1115 | t = L[ roundstate_string[GetRoundState()] ] | |
1116 | end | |
1117 | ||
1118 | surface.SetDrawColor( 0, 0, 0, 200 ) | |
1119 | ||
1120 | local mul = 0 | |
1121 | local font = "FC_HUD_20" | |
1122 | ||
1123 | if FC_HUD.LargerStatus then | |
1124 | mul = 4 | |
1125 | font = "FC_HUD_30" | |
1126 | end | |
1127 | ||
1128 | surface.SetMaterial( FC_HUD.White ) | |
1129 | local tab = CreateBorderedCircle(30, y - mul, 10 + mul, 10 + mul, 100, 0, 20) | |
1130 | surface.SetMaterial( FC_HUD.White ) | |
1131 | DrawCorrectFuckingPoly(tab) | |
1132 | ||
1133 | surface.SetDrawColor( col ) | |
1134 | ||
1135 | surface.SetMaterial( FC_HUD.White ) | |
1136 | local tab = CreateBorderedCircle(30, y - mul, 8 + mul, 8 + mul, 100, 0, 20) | |
1137 | surface.SetMaterial( FC_HUD.White ) | |
1138 | DrawCorrectFuckingPoly(tab) | |
1139 | ||
1140 | surface.SetFont(font) | |
1141 | local w, h = surface.GetTextSize(string.upper(t)) | |
1142 | local w2, h2 = surface.GetTextSize(string.upper(text)) | |
1143 | local w3 = 0 | |
1144 | ||
1145 | if text != "" then | |
1146 | w3 = surface.GetTextSize(" - ") | |
1147 | end | |
1148 | ||
1149 | local BoxCol = Color(0,0,0,200) | |
1150 | ||
1151 | if FC_HUD.ColoredRoleBack and GetRoundState() == ROUND_ACTIVE and LocalPlayer():Alive() and LocalPlayer():Team() != TEAM_SPECTATOR then | |
1152 | if LocalPlayer():IsActiveTraitor() then | |
1153 | BoxCol = Color(150, 0, 0, 200) | |
1154 | elseif LocalPlayer():IsActiveDetective() then | |
1155 | BoxCol = Color(0, 0, 150, 200) | |
1156 | else | |
1157 | BoxCol = Color(0, 150, 0, 200) | |
1158 | end | |
1159 | end | |
1160 | ||
1161 | local TextColor = Color(255,255,255,200) | |
1162 | ||
1163 | if FC_HUD.ColoredRoleText and GetRoundState() == ROUND_ACTIVE and LocalPlayer():Alive() and LocalPlayer():Team() != TEAM_SPECTATOR then | |
1164 | if LocalPlayer():IsActiveTraitor() then | |
1165 | TextColor = role_string["traitor"] | |
1166 | elseif LocalPlayer():IsActiveDetective() then | |
1167 | TextColor = role_string["detective"] | |
1168 | else | |
1169 | TextColor = role_string["innocent"] | |
1170 | end | |
1171 | end | |
1172 | ||
1173 | draw.RoundedBox(2, 50 - 2, y-10 - mul * 2, w + 8 + w2 + w3, 20 + mul * 2, BoxCol) | |
1174 | local xz, yz = draw.SimpleText(string.upper(t), font, 52, y - mul, TextColor, TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER) | |
1175 | if text != "" then | |
1176 | xz = draw.SimpleText(" - ", font, 52 + xz, y - mul, TextColor, TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER) + xz | |
1177 | end | |
1178 | draw.SimpleText(string.upper(text), font, 52 + xz, y - mul, color, TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER) | |
1179 | end) | |
1180 | end) | |
1181 | end |