From 5ddc9eb9d02ddc84e4c3a45bdcb2941513fb0346 Mon Sep 17 00:00:00 2001 From: salmonik Date: Wed, 4 Nov 2026 18:58:13 +0100 Subject: Chams: per-relationship, visible/invisible styles and viewmodel - Hostile/neutral/friendly each have independent visible and through-wall settings: enable, style and colour. Viewmodel has its own enable/style/colour. - Styles: Flat, Wireframe, Additive, Solid, White, Fullbright, Glow outline. Additive uses the model solid material + ADDITIVE flag (the VGUI additive was invisible on NPCs). White/fullbright are solid-based, so the viewmodel no longer disappears/checkerboards. Glow outline adds a wireframe contour pass for depth. - Config: [chams] active/bind, [chams_hostile|neutral|friendly] vis/inv settings, [chams_vm]. GUI sections for each group. --- src/menu.cpp | 108 +++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 83 insertions(+), 25 deletions(-) (limited to 'src/menu.cpp') diff --git a/src/menu.cpp b/src/menu.cpp index 6a3c607..bdb9531 100644 --- a/src/menu.cpp +++ b/src/menu.cpp @@ -63,11 +63,13 @@ FeatureState g_skybox{false, 0}; // skybox.png image override FeatureState g_projectiles{true, 0}; // grenade / rocket ESP bool g_proj_fuse = true; bool g_proj_radius = true; -FeatureState g_chams{false, 0}; // flat model material, optional through walls -bool g_chams_walls = true; +FeatureState g_chams{false, 0}; +ChamsGroup g_chams_hostile{true, 3, {255, 60, 60}, true, 3, {255, 60, 60}}; +ChamsGroup g_chams_neutral{true, 3, {220, 220, 220}, false, 3, {220, 220, 220}}; +ChamsGroup g_chams_friendly{true, 3, {60, 255, 60}, false, 3, {60, 255, 60}}; bool g_chams_viewmodel = false; -int g_chams_mat_index = 0; -int g_chams_rgb[3] = {255, 60, 60}; +int g_chams_vm_mat = 3; +int g_chams_vm_rgb[3] = {200, 200, 255}; bool g_item_health = true; bool g_item_ammo = true; bool g_item_armor = true; @@ -239,11 +241,20 @@ void config_save() { fprintf(f, "[projectiles]\nactive=%d\nbind=%d\nfuse=%d\nradius=%d\n", g_projectiles.active, g_projectiles.bind, (int)g_proj_fuse, (int)g_proj_radius); - fprintf(f, "[chams]\nactive=%d\nbind=%d\nwalls=%d\nviewmodel=%d\n" - "material=%d\nr=%d\ng=%d\nb=%d\n", - g_chams.active, g_chams.bind, (int)g_chams_walls, - (int)g_chams_viewmodel, g_chams_mat_index, g_chams_rgb[0], - g_chams_rgb[1], g_chams_rgb[2]); + fprintf(f, "[chams]\nactive=%d\nbind=%d\n", g_chams.active, g_chams.bind); + auto save_chams = [&](const char *name, const ChamsGroup &g) { + fprintf(f, "[%s]\nvis=%d\nvis_mat=%d\nvis_r=%d\nvis_g=%d\nvis_b=%d\n" + "inv=%d\ninv_mat=%d\ninv_r=%d\ninv_g=%d\ninv_b=%d\n", + name, (int)g.vis_on, g.vis_mat, g.vis_rgb[0], g.vis_rgb[1], + g.vis_rgb[2], (int)g.inv_on, g.inv_mat, g.inv_rgb[0], + g.inv_rgb[1], g.inv_rgb[2]); + }; + save_chams("chams_hostile", g_chams_hostile); + save_chams("chams_neutral", g_chams_neutral); + save_chams("chams_friendly", g_chams_friendly); + fprintf(f, "[chams_vm]\non=%d\nmat=%d\nr=%d\ng=%d\nb=%d\n", + (int)g_chams_viewmodel, g_chams_vm_mat, g_chams_vm_rgb[0], + g_chams_vm_rgb[1], g_chams_vm_rgb[2]); fprintf(f, "[items]\nactive=%d\nbind=%d\nhealth=%d\nammo=%d\n" "armor=%d\nweapons=%d\ncrates=%d\ndistance=%d\nmax_dist=%d\n" "usable=%d\n", @@ -294,10 +305,14 @@ static bool config_load() { bool in_esp = false, in_bhop = false, in_aim = false, in_jumpbug = false, in_spread = false, in_items = false, in_tint = false, in_fog = false, in_view = false, in_movement = false, - in_proj = false, in_chams = false; + in_proj = false; + ChamsGroup *chams_grp = nullptr; + bool in_chams_vm = false; while (fgets(line, sizeof(line), f)) { line[strcspn(line, "\r\n")] = 0; if (line[0] == '[') { + chams_grp = nullptr; + in_chams_vm = false; if (strstr(line, "[bhop]")) cur = &g_bhop; else if (strstr(line, "[abh]")) @@ -324,6 +339,19 @@ static bool config_load() { cur = &g_projectiles; else if (strstr(line, "[chams]")) cur = &g_chams; + else if (strstr(line, "[chams_hostile]")) { + cur = nullptr; + chams_grp = &g_chams_hostile; + } else if (strstr(line, "[chams_neutral]")) { + cur = nullptr; + chams_grp = &g_chams_neutral; + } else if (strstr(line, "[chams_friendly]")) { + cur = nullptr; + chams_grp = &g_chams_friendly; + } else if (strstr(line, "[chams_vm]")) { + cur = nullptr; + in_chams_vm = true; + } else if (strstr(line, "[aimbot]")) cur = &g_aimbot; else if (strstr(line, "[triggerbot]")) @@ -347,8 +375,8 @@ static bool config_load() { in_view = strstr(line, "[view]") != nullptr; in_movement = strstr(line, "[movement]") != nullptr; in_proj = (cur == &g_projectiles); - in_chams = (cur == &g_chams); - } else if (cur || in_view || in_movement) { + } else if (cur || in_view || in_movement || chams_grp || + in_chams_vm) { char *eq = strchr(line, '='); if (!eq) continue; @@ -394,22 +422,50 @@ static bool config_load() { else if (strcmp(key, "radius") == 0) g_proj_radius = atoi(val) != 0; } - if (in_chams) { - if (strcmp(key, "walls") == 0) - g_chams_walls = atoi(val) != 0; - else if (strcmp(key, "viewmodel") == 0) + if (chams_grp) { + ChamsGroup &g = *chams_grp; + if (strcmp(key, "vis") == 0) + g.vis_on = atoi(val) != 0; + else if (strcmp(key, "vis_mat") == 0) { + int v = atoi(val); + if (v < 0) v = 0; + if (v > 6) v = 6; + g.vis_mat = v; + } else if (strcmp(key, "vis_r") == 0 || strcmp(key, "vis_g") == 0 || + strcmp(key, "vis_b") == 0) { + int v = atoi(val); + if (v < 0) v = 0; + if (v > 255) v = 255; + g.vis_rgb[key[4] == 'r' ? 0 : key[4] == 'g' ? 1 : 2] = v; + } else if (strcmp(key, "inv") == 0) + g.inv_on = atoi(val) != 0; + else if (strcmp(key, "inv_mat") == 0) { + int v = atoi(val); + if (v < 0) v = 0; + if (v > 6) v = 6; + g.inv_mat = v; + } else if (strcmp(key, "inv_r") == 0 || strcmp(key, "inv_g") == 0 || + strcmp(key, "inv_b") == 0) { + int v = atoi(val); + if (v < 0) v = 0; + if (v > 255) v = 255; + g.inv_rgb[key[4] == 'r' ? 0 : key[4] == 'g' ? 1 : 2] = v; + } + } + if (in_chams_vm) { + if (strcmp(key, "on") == 0) g_chams_viewmodel = atoi(val) != 0; - else if (strcmp(key, "material") == 0) { + else if (strcmp(key, "mat") == 0) { int v = atoi(val); if (v < 0) v = 0; - if (v > 5) v = 5; - g_chams_mat_index = v; + if (v > 6) v = 6; + g_chams_vm_mat = v; } else if (strcmp(key, "r") == 0 || strcmp(key, "g") == 0 || strcmp(key, "b") == 0) { int v = atoi(val); if (v < 0) v = 0; if (v > 255) v = 255; - g_chams_rgb[key[0] == 'r' ? 0 : key[0] == 'g' ? 1 : 2] = v; + g_chams_vm_rgb[key[0] == 'r' ? 0 : key[0] == 'g' ? 1 : 2] = v; } } if (in_aim) { @@ -637,12 +693,14 @@ void config_reset_defaults() { g_proj_fuse = true; g_proj_radius = true; g_chams = {false, 0}; - g_chams_walls = true; + g_chams_hostile = {true, 3, {255, 60, 60}, true, 3, {255, 60, 60}}; + g_chams_neutral = {true, 3, {220, 220, 220}, false, 3, {220, 220, 220}}; + g_chams_friendly = {true, 3, {60, 255, 60}, false, 3, {60, 255, 60}}; g_chams_viewmodel = false; - g_chams_mat_index = 0; - g_chams_rgb[0] = 255; - g_chams_rgb[1] = 60; - g_chams_rgb[2] = 60; + g_chams_vm_mat = 3; + g_chams_vm_rgb[0] = 200; + g_chams_vm_rgb[1] = 200; + g_chams_vm_rgb[2] = 255; g_item_health = true; g_item_ammo = true; g_item_armor = true; -- cgit v1.2.3