diff options
| author | salmonik <salmonik@tuta.io> | 2026-11-04 19:36:24 +0100 |
|---|---|---|
| committer | salmonik <salmonik@tuta.io> | 2026-11-04 19:36:24 +0100 |
| commit | b661a8dfd2c02bea54d8581ebb35d0fb3267867c (patch) | |
| tree | 817760a933a14cc0e6446299424a017a9a1c88cf /src/menu.cpp | |
| parent | Chams: keep additive viewmodel visible on bright backgrounds (diff) | |
| download | hl2h-b661a8dfd2c02bea54d8581ebb35d0fb3267867c.tar.gz hl2h-b661a8dfd2c02bea54d8581ebb35d0fb3267867c.zip | |
Chams: per-colour alpha and a softer viewmodel additive base
- Colour picker gains an optional alpha bar (checkerboard preview, #RRGGBBAA
readout); add_color_alpha is used for the chams colours. Chams colours are
now r,g,b,a and chams_apply sets $alpha plus MATERIAL_VAR_TRANSLUCENT when
alpha < 255. Config stores vis_a / inv_a / vm a.
- The additive viewmodel base is now a faint translucent tint (alpha/8)
instead of an opaque fill, so additive/Fullbright stay see-through and the
viewmodel no longer becomes a solid blob. Fullbright whitening reduced to
25% so blue stays blue instead of turning lavender.
Diffstat (limited to '')
| -rw-r--r-- | src/menu.cpp | 50 |
1 files changed, 32 insertions, 18 deletions
diff --git a/src/menu.cpp b/src/menu.cpp index bdb9531..873f5ed 100644 --- a/src/menu.cpp +++ b/src/menu.cpp | |||
| @@ -64,12 +64,15 @@ FeatureState g_projectiles{true, 0}; // grenade / rocket ESP | |||
| 64 | bool g_proj_fuse = true; | 64 | bool g_proj_fuse = true; |
| 65 | bool g_proj_radius = true; | 65 | bool g_proj_radius = true; |
| 66 | FeatureState g_chams{false, 0}; | 66 | FeatureState g_chams{false, 0}; |
| 67 | ChamsGroup g_chams_hostile{true, 3, {255, 60, 60}, true, 3, {255, 60, 60}}; | 67 | ChamsGroup g_chams_hostile{true, 3, {255, 60, 60, 255}, true, 3, |
| 68 | ChamsGroup g_chams_neutral{true, 3, {220, 220, 220}, false, 3, {220, 220, 220}}; | 68 | {255, 60, 60, 255}}; |
| 69 | ChamsGroup g_chams_friendly{true, 3, {60, 255, 60}, false, 3, {60, 255, 60}}; | 69 | ChamsGroup g_chams_neutral{true, 3, {220, 220, 220, 255}, false, 3, |
| 70 | {220, 220, 220, 255}}; | ||
| 71 | ChamsGroup g_chams_friendly{true, 3, {60, 255, 60, 255}, false, 3, | ||
| 72 | {60, 255, 60, 255}}; | ||
| 70 | bool g_chams_viewmodel = false; | 73 | bool g_chams_viewmodel = false; |
| 71 | int g_chams_vm_mat = 3; | 74 | int g_chams_vm_mat = 3; |
| 72 | int g_chams_vm_rgb[3] = {200, 200, 255}; | 75 | int g_chams_vm_rgb[4] = {200, 200, 255, 255}; |
| 73 | bool g_item_health = true; | 76 | bool g_item_health = true; |
| 74 | bool g_item_ammo = true; | 77 | bool g_item_ammo = true; |
| 75 | bool g_item_armor = true; | 78 | bool g_item_armor = true; |
| @@ -244,17 +247,18 @@ void config_save() { | |||
| 244 | fprintf(f, "[chams]\nactive=%d\nbind=%d\n", g_chams.active, g_chams.bind); | 247 | fprintf(f, "[chams]\nactive=%d\nbind=%d\n", g_chams.active, g_chams.bind); |
| 245 | auto save_chams = [&](const char *name, const ChamsGroup &g) { | 248 | auto save_chams = [&](const char *name, const ChamsGroup &g) { |
| 246 | fprintf(f, "[%s]\nvis=%d\nvis_mat=%d\nvis_r=%d\nvis_g=%d\nvis_b=%d\n" | 249 | fprintf(f, "[%s]\nvis=%d\nvis_mat=%d\nvis_r=%d\nvis_g=%d\nvis_b=%d\n" |
| 247 | "inv=%d\ninv_mat=%d\ninv_r=%d\ninv_g=%d\ninv_b=%d\n", | 250 | "vis_a=%d\ninv=%d\ninv_mat=%d\ninv_r=%d\ninv_g=%d\ninv_b=%d\n" |
| 251 | "inv_a=%d\n", | ||
| 248 | name, (int)g.vis_on, g.vis_mat, g.vis_rgb[0], g.vis_rgb[1], | 252 | name, (int)g.vis_on, g.vis_mat, g.vis_rgb[0], g.vis_rgb[1], |
| 249 | g.vis_rgb[2], (int)g.inv_on, g.inv_mat, g.inv_rgb[0], | 253 | g.vis_rgb[2], g.vis_rgb[3], (int)g.inv_on, g.inv_mat, |
| 250 | g.inv_rgb[1], g.inv_rgb[2]); | 254 | g.inv_rgb[0], g.inv_rgb[1], g.inv_rgb[2], g.inv_rgb[3]); |
| 251 | }; | 255 | }; |
| 252 | save_chams("chams_hostile", g_chams_hostile); | 256 | save_chams("chams_hostile", g_chams_hostile); |
| 253 | save_chams("chams_neutral", g_chams_neutral); | 257 | save_chams("chams_neutral", g_chams_neutral); |
| 254 | save_chams("chams_friendly", g_chams_friendly); | 258 | save_chams("chams_friendly", g_chams_friendly); |
| 255 | fprintf(f, "[chams_vm]\non=%d\nmat=%d\nr=%d\ng=%d\nb=%d\n", | 259 | fprintf(f, "[chams_vm]\non=%d\nmat=%d\nr=%d\ng=%d\nb=%d\na=%d\n", |
| 256 | (int)g_chams_viewmodel, g_chams_vm_mat, g_chams_vm_rgb[0], | 260 | (int)g_chams_viewmodel, g_chams_vm_mat, g_chams_vm_rgb[0], |
| 257 | g_chams_vm_rgb[1], g_chams_vm_rgb[2]); | 261 | g_chams_vm_rgb[1], g_chams_vm_rgb[2], g_chams_vm_rgb[3]); |
| 258 | fprintf(f, "[items]\nactive=%d\nbind=%d\nhealth=%d\nammo=%d\n" | 262 | fprintf(f, "[items]\nactive=%d\nbind=%d\nhealth=%d\nammo=%d\n" |
| 259 | "armor=%d\nweapons=%d\ncrates=%d\ndistance=%d\nmax_dist=%d\n" | 263 | "armor=%d\nweapons=%d\ncrates=%d\ndistance=%d\nmax_dist=%d\n" |
| 260 | "usable=%d\n", | 264 | "usable=%d\n", |
| @@ -432,11 +436,13 @@ static bool config_load() { | |||
| 432 | if (v > 6) v = 6; | 436 | if (v > 6) v = 6; |
| 433 | g.vis_mat = v; | 437 | g.vis_mat = v; |
| 434 | } else if (strcmp(key, "vis_r") == 0 || strcmp(key, "vis_g") == 0 || | 438 | } else if (strcmp(key, "vis_r") == 0 || strcmp(key, "vis_g") == 0 || |
| 435 | strcmp(key, "vis_b") == 0) { | 439 | strcmp(key, "vis_b") == 0 || strcmp(key, "vis_a") == 0) { |
| 436 | int v = atoi(val); | 440 | int v = atoi(val); |
| 437 | if (v < 0) v = 0; | 441 | if (v < 0) v = 0; |
| 438 | if (v > 255) v = 255; | 442 | if (v > 255) v = 255; |
| 439 | g.vis_rgb[key[4] == 'r' ? 0 : key[4] == 'g' ? 1 : 2] = v; | 443 | int idx = key[4] == 'r' ? 0 : key[4] == 'g' ? 1 |
| 444 | : key[4] == 'b' ? 2 : 3; | ||
| 445 | g.vis_rgb[idx] = v; | ||
| 440 | } else if (strcmp(key, "inv") == 0) | 446 | } else if (strcmp(key, "inv") == 0) |
| 441 | g.inv_on = atoi(val) != 0; | 447 | g.inv_on = atoi(val) != 0; |
| 442 | else if (strcmp(key, "inv_mat") == 0) { | 448 | else if (strcmp(key, "inv_mat") == 0) { |
| @@ -445,11 +451,13 @@ static bool config_load() { | |||
| 445 | if (v > 6) v = 6; | 451 | if (v > 6) v = 6; |
| 446 | g.inv_mat = v; | 452 | g.inv_mat = v; |
| 447 | } else if (strcmp(key, "inv_r") == 0 || strcmp(key, "inv_g") == 0 || | 453 | } else if (strcmp(key, "inv_r") == 0 || strcmp(key, "inv_g") == 0 || |
| 448 | strcmp(key, "inv_b") == 0) { | 454 | strcmp(key, "inv_b") == 0 || strcmp(key, "inv_a") == 0) { |
| 449 | int v = atoi(val); | 455 | int v = atoi(val); |
| 450 | if (v < 0) v = 0; | 456 | if (v < 0) v = 0; |
| 451 | if (v > 255) v = 255; | 457 | if (v > 255) v = 255; |
| 452 | g.inv_rgb[key[4] == 'r' ? 0 : key[4] == 'g' ? 1 : 2] = v; | 458 | int idx = key[4] == 'r' ? 0 : key[4] == 'g' ? 1 |
| 459 | : key[4] == 'b' ? 2 : 3; | ||
| 460 | g.inv_rgb[idx] = v; | ||
| 453 | } | 461 | } |
| 454 | } | 462 | } |
| 455 | if (in_chams_vm) { | 463 | if (in_chams_vm) { |
| @@ -461,11 +469,13 @@ static bool config_load() { | |||
| 461 | if (v > 6) v = 6; | 469 | if (v > 6) v = 6; |
| 462 | g_chams_vm_mat = v; | 470 | g_chams_vm_mat = v; |
| 463 | } else if (strcmp(key, "r") == 0 || strcmp(key, "g") == 0 || | 471 | } else if (strcmp(key, "r") == 0 || strcmp(key, "g") == 0 || |
| 464 | strcmp(key, "b") == 0) { | 472 | strcmp(key, "b") == 0 || strcmp(key, "a") == 0) { |
| 465 | int v = atoi(val); | 473 | int v = atoi(val); |
| 466 | if (v < 0) v = 0; | 474 | if (v < 0) v = 0; |
| 467 | if (v > 255) v = 255; | 475 | if (v > 255) v = 255; |
| 468 | g_chams_vm_rgb[key[0] == 'r' ? 0 : key[0] == 'g' ? 1 : 2] = v; | 476 | int idx = key[0] == 'r' ? 0 : key[0] == 'g' ? 1 |
| 477 | : key[0] == 'b' ? 2 : 3; | ||
| 478 | g_chams_vm_rgb[idx] = v; | ||
| 469 | } | 479 | } |
| 470 | } | 480 | } |
| 471 | if (in_aim) { | 481 | if (in_aim) { |
| @@ -693,14 +703,18 @@ void config_reset_defaults() { | |||
| 693 | g_proj_fuse = true; | 703 | g_proj_fuse = true; |
| 694 | g_proj_radius = true; | 704 | g_proj_radius = true; |
| 695 | g_chams = {false, 0}; | 705 | g_chams = {false, 0}; |
| 696 | g_chams_hostile = {true, 3, {255, 60, 60}, true, 3, {255, 60, 60}}; | 706 | g_chams_hostile = {true, 3, {255, 60, 60, 255}, true, 3, |
| 697 | g_chams_neutral = {true, 3, {220, 220, 220}, false, 3, {220, 220, 220}}; | 707 | {255, 60, 60, 255}}; |
| 698 | g_chams_friendly = {true, 3, {60, 255, 60}, false, 3, {60, 255, 60}}; | 708 | g_chams_neutral = {true, 3, {220, 220, 220, 255}, false, 3, |
| 709 | {220, 220, 220, 255}}; | ||
| 710 | g_chams_friendly = {true, 3, {60, 255, 60, 255}, false, 3, | ||
| 711 | {60, 255, 60, 255}}; | ||
| 699 | g_chams_viewmodel = false; | 712 | g_chams_viewmodel = false; |
| 700 | g_chams_vm_mat = 3; | 713 | g_chams_vm_mat = 3; |
| 701 | g_chams_vm_rgb[0] = 200; | 714 | g_chams_vm_rgb[0] = 200; |
| 702 | g_chams_vm_rgb[1] = 200; | 715 | g_chams_vm_rgb[1] = 200; |
| 703 | g_chams_vm_rgb[2] = 255; | 716 | g_chams_vm_rgb[2] = 255; |
| 717 | g_chams_vm_rgb[3] = 255; | ||
| 704 | g_item_health = true; | 718 | g_item_health = true; |
| 705 | g_item_ammo = true; | 719 | g_item_ammo = true; |
| 706 | g_item_armor = true; | 720 | g_item_armor = true; |
