Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Local player spectator list. Defuse kit identificator. #62

Merged
merged 19 commits into from
Oct 11, 2023
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
4c12683
Text "KIT" is show on top op player, that has defuse kit.
PetrSeifert Oct 8, 2023
1c7d03c
Merge branch 'master' of https://github.com/PetrSeifert/Valthrun
PetrSeifert Oct 8, 2023
689b18c
Added player names, esp_info_kit can now be disabled from visuals tab.
PetrSeifert Oct 8, 2023
cee1180
Merge remote-tracking branch 'upstream/master'
PetrSeifert Oct 8, 2023
ff883ab
Added back SRH checkbox, "KIT" text is no longer rendered over player…
PetrSeifert Oct 8, 2023
1cc58e2
Merge remote-tracking branch 'upstream/master'
PetrSeifert Oct 9, 2023
f1dd2ce
Added spectator list for local player
PetrSeifert Oct 10, 2023
19338c7
Disable Simple Recoil Helper not finished
PetrSeifert Oct 10, 2023
00bb9a7
Removed player names feature, someone else is allready working on it.
PetrSeifert Oct 10, 2023
ae07a62
Removed .idea directory
PetrSeifert Oct 10, 2023
f1c29c1
Added .idea directory to .gitignore
PetrSeifert Oct 10, 2023
7e8b100
Applied some suggestions from review.
PetrSeifert Oct 10, 2023
6b6108f
Changed names to match master.
PetrSeifert Oct 10, 2023
fd42df8
Merge remote-tracking branch 'upstream/master' into develop
PetrSeifert Oct 10, 2023
1dd1a84
Reduced readings for spectators list.
PetrSeifert Oct 10, 2023
7ea9269
Merge remote-tracking branch 'upstream/master' into develop
PetrSeifert Oct 10, 2023
13f01ad
Spectator list is now shown for player you are spectating. Fixed y_of…
PetrSeifert Oct 10, 2023
0cd0474
Update spectators_list.rs
PetrSeifert Oct 10, 2023
7d806a4
Fixed error if there was no one to spectate
PetrSeifert Oct 10, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions controller/src/enhancements/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ pub use player::*;
mod trigger;
pub use trigger::*;

mod spectators_list;
pub use spectators_list::*;

mod aim;
pub use aim::*;

Expand Down
32 changes: 26 additions & 6 deletions controller/src/enhancements/player.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ pub struct PlayerInfo {
pub team_id: u8,

pub player_health: i32,
pub player_has_defuser: bool,
pub player_name: String,
pub weapon: WeaponId,

Expand Down Expand Up @@ -130,11 +131,11 @@ impl PlayerESP {
return Ok(None);
}

let controller_handle = player_pawn.m_hController()?;
let current_controller = ctx.cs2_entities.get_by_handle(&controller_handle)?;
let player_controller_handle = player_pawn.m_hOriginalController()?;
PetrSeifert marked this conversation as resolved.
Show resolved Hide resolved
let player_current_controller = ctx.cs2_entities.get_by_handle(&player_controller_handle)?;

let player_team = player_pawn.m_iTeamNum()?;
let player_name = if let Some(identity) = &current_controller {
let player_name = if let Some(identity) = &player_current_controller {
let player_controller = identity.entity()?.reference_schema()?;
CStr::from_bytes_until_nul(&player_controller.m_iszPlayerName()?)
.context("player name missing nul terminator")?
Expand All @@ -145,6 +146,13 @@ impl PlayerESP {
"unknown".to_string()
};

let player_has_defuser = if let Some(identity) = &player_current_controller {
let player_controller = identity.entity()?.reference_schema()?;
player_controller.m_bPawnHasDefuser()?
} else {
false
};

let position =
nalgebra::Vector3::<f32>::from_column_slice(&game_screen_node.m_vecAbsOrigin()?);

Expand Down Expand Up @@ -174,10 +182,11 @@ impl PlayerESP {
};

Ok(Some(PlayerInfo {
controller_entity_id: controller_handle.get_entity_index(),
controller_entity_id: player_controller_handle.get_entity_index(),
team_id: player_team,

player_name,
player_has_defuser,
player_health,
weapon: WeaponId::from_id(weapon_type).unwrap_or(WeaponId::Unknown),

Expand Down Expand Up @@ -363,7 +372,7 @@ impl Enhancement for PlayerESP {
}
}

if settings.esp_info_health || settings.esp_info_weapon {
if settings.esp_info_health || settings.esp_info_weapon || settings.esp_info_kit {
if let Some(pos) = view.world_to_screen(&entry.position, false) {
let entry_height = entry.calculate_screen_height(view).unwrap_or(100.0);
let target_scale = entry_height * 15.0 / view.screen_bounds.y;
Expand Down Expand Up @@ -393,7 +402,18 @@ impl Enhancement for PlayerESP {

draw.add_text(pos, esp_color.clone(), text);

// y_offset += ui.text_line_height_with_spacing() * target_scale;
y_offset += ui.text_line_height_with_spacing() * target_scale;
}

if entry.player_has_defuser && settings.esp_info_kit {
let text = format!("KIT");
PetrSeifert marked this conversation as resolved.
Show resolved Hide resolved
let [text_width, _] = ui.calc_text_size(&text);
let mut pos = pos.clone();
pos.x -= text_width / 2.0;
pos.y += y_offset;
draw.add_text(pos, esp_color.clone(),text);

//y_offset += ui.text_line_height_with_spacing() * target_scale;
}

ui.set_window_font_scale(1.0);
Expand Down
166 changes: 166 additions & 0 deletions controller/src/enhancements/spectators_list.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
use std::{
ffi::CStr,
};

use anyhow::Context;
use cs2::CEntityIdentityEx;
use obfstr::obfstr;
use cs2_schema_generated::cs2::client::{
CCSPlayerController,
C_CSObserverPawn,
};

use super::Enhancement;

pub struct SpectatorInfo {
pub spectator_name: String,
}

pub struct SpectatorsList {
spectators: Vec<SpectatorInfo>
}

impl SpectatorsList {
pub fn new() -> Self {
SpectatorsList{
spectators: Default::default(),
}
}
}

impl Enhancement for SpectatorsList {
fn update(&mut self, ctx: &crate::UpdateContext) -> anyhow::Result<()> {
self.spectators.clear();

if !ctx.settings.spectators_list {
return Ok(());
}

let local_player_controller = ctx
.cs2_entities
.get_local_player_controller()?
.try_reference_schema()
.with_context(|| obfstr!("failed to read local player controller").to_string())?;

let local_player_controller = match local_player_controller {
Some(controller) => controller,
None => {
/* We're currently not connected */
return Ok(());
}
};

let observice_entity_handle = if local_player_controller.m_bPawnIsAlive()? {
local_player_controller.m_hPawn()?.get_entity_index()
} else {
return Ok(());
};

for entity_identity in ctx.cs2_entities.all_identities() {
if entity_identity.handle::<()>()?.get_entity_index() == observice_entity_handle {
/* current pawn we control/observe */
continue;
}

let entity_class = ctx
.class_name_cache
.lookup(&entity_identity.entity_class_info()?)?;

if !entity_class
PetrSeifert marked this conversation as resolved.
Show resolved Hide resolved
.map(|name| *name == "CCSPlayerController")
.unwrap_or(false)
{
/* entity is not a player pawn */
continue;
}

let player_controller_ptr = entity_identity.entity_ptr::<CCSPlayerController>()?;
let player_controller = player_controller_ptr.read_schema()?;
let player_pawn_handle = player_controller.m_hPawn()?;
let current_player_pawn = ctx.cs2_entities.get_by_handle(&player_pawn_handle)?;

let player_pawn = if let Some(identity) = &current_player_pawn
{
identity.entity()?.reference_schema()?
} else {
continue;
};

let observer_services_ptr = player_pawn.m_pObserverServices();
let observer_services = observer_services_ptr?
.try_reference_schema()
.with_context(|| obfstr!("failed to read observer services").to_string())?;

let observer_target_handle = match observer_services {
Some(observer) => observer.m_hObserverTarget()?,
None => {
continue;
}
};

let current_target = ctx.cs2_entities.get_by_handle(&observer_target_handle)?;

let observer_target = if let Some(identity) = &current_target
{
identity.entity()?.cast::<C_CSObserverPawn>().reference_schema()?
} else {
continue;
};

let target_controller_handle = observer_target.m_hController()?;
let target_current_controller = ctx.cs2_entities.get_by_handle(&target_controller_handle)?;

let target_controller = if let Some(identity) = &target_current_controller
{
identity.entity()?.reference_schema()?
} else {
continue;
};

if target_controller.m_hPawn()?.get_entity_index() != observice_entity_handle {
PetrSeifert marked this conversation as resolved.
Show resolved Hide resolved
continue;
}

let spectator_name = CStr::from_bytes_until_nul(&player_controller.m_iszPlayerName()?)
.context("player name missing nul terminator")?
.to_str()
.context("invalid player name")?
.to_string();

self.spectators.push(SpectatorInfo{
spectator_name
});
continue;
}

Ok(())
}

fn render(
&self,
settings: &crate::settings::AppSettings,
ui: &imgui::Ui,
_view: &crate::view::ViewController,
) {
if !settings.spectators_list {
return;
}

let group = ui.begin_group();

let line_count = self.spectators.iter().count();
let text_height = ui.text_line_height_with_spacing() * line_count as f32;

let offset_x = ui.io().display_size[0] * 0.01;
let offset_y = (ui.io().display_size[1] + text_height) * 0.5;
let mut offset_y = offset_y;

for spectator in self.spectators.iter() {
ui.set_cursor_pos([offset_x, offset_y]);
ui.text(&format!("{}", spectator.spectator_name));
offset_y += ui.text_line_height_with_spacing();
};

group.end();
}
}
2 changes: 2 additions & 0 deletions controller/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ use crate::{
BombInfo,
PlayerESP,
TriggerBot,
SpectatorsList
},
settings::save_app_settings,
view::LocalCrosshair,
Expand Down Expand Up @@ -484,6 +485,7 @@ fn main_overlay() -> anyhow::Result<()> {

enhancements: vec![
Rc::new(RefCell::new(PlayerESP::new())),
Rc::new(RefCell::new(SpectatorsList::new())),
Rc::new(RefCell::new(BombInfo::new())),
Rc::new(RefCell::new(TriggerBot::new(LocalCrosshair::new(
cs2_offsets.offset_crosshair_id,
Expand Down
6 changes: 6 additions & 0 deletions controller/src/settings/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -90,12 +90,18 @@ pub struct AppSettings {
#[serde(default = "bool_false")]
pub esp_info_health: bool,

#[serde(default = "bool_false")]
pub esp_info_kit: bool,

#[serde(default = "bool_false")]
pub esp_info_weapon: bool,

#[serde(default = "bool_true")]
pub bomb_timer: bool,

#[serde(default = "bool_false")]
pub spectators_list: bool,

#[serde(default = "bool_true")]
pub valthrun_watermark: bool,

Expand Down
4 changes: 3 additions & 1 deletion controller/src/settings/ui.rs
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ impl SettingsUI {
}

ui.checkbox(obfstr!("Display player health"), &mut settings.esp_info_health);
ui.checkbox(obfstr!("Display if player has kit"), &mut settings.esp_info_kit);
ui.checkbox(obfstr!("Show player weapon"), &mut settings.esp_info_weapon);

ui.checkbox(obfstr!("ESP Team"), &mut settings.esp_enabled_team);
Expand Down Expand Up @@ -135,6 +136,7 @@ impl SettingsUI {
}

ui.checkbox(obfstr!("Bomb Timer"), &mut settings.bomb_timer);
ui.checkbox(obfstr!("Spectators List"), &mut settings.spectators_list);
}

if let Some(_) = ui.tab_item(obfstr!("Aim Assist")) {
Expand Down Expand Up @@ -165,7 +167,7 @@ impl SettingsUI {
ui.separator();
}

// ui.checkbox("Simle Recoil Helper", &mut settings.aim_assist_recoil);
//ui.checkbox("Simle Recoil Helper", &mut settings.aim_assist_recoil);
}


Expand Down