
















(edited)








<leader>f for file picker in cwd
$ for gotoline_end
`` for goto_line_start
etc, because i was used to those from vim

.local/share/nvim/.netrwhist, I removed them and now nvim works






CGameWorld::GameTick() function. You can convert ticks to seconds by dividing the value by SERVER_TICK_SPEED (50). 













1






2





















(edited)












(edited)






1














1









1




Senior Global Key Account Manager?

















2















1





















tick = tickspeed * constant and other things are implemented with next_tick = next_tick + constant * tickspeed. again the code does not have changing tickspeed in mind in the first place. you will need to huntdown every tickspeed related calculation and adjust the implementation to make them sync



#define with int isn't exactly hard...



#define with int isn't exactly hard... 













1





























































1











1










you can't tell me 300 samples of granularity is worse than sticking to 60 samples






























1
see you guys in #off-topic for rhythm game stuff











1















1




















anyway. i just think subtick is a great way to improve the 64tps server without doubling the cost. and i think the tickrate lock down is that 128 is causing way too many unintended edge cases for the subtick system so they just killed it because they do not want to deal with them with their already limited development resources on the subtick thing. killing faceit as a incentive is a dumb move and i don't think valve is dumb. here. i need to sleep now. thanks for listening to my ted talk. 


sv_rescue 1.
no team / t0
1. no /r -> finish
2. use /r after start, to reset to position after start -> finish
3. use /r after start, to reset to position before start -> finish
in team
1. no /r -> finish
2. use /r after start, to reset to position after start -> finish
3. use /r after start, to reset to position before start -> no finish ??
here is a video showing all 6 cases: https://streamable.com/8d8q0n
In the third case the timer resets back to as if you'd never touched the start line. However, when not in a team the timer starts again when the start line is touched. However, this does not work when you are in a team. Is this intended behaviour or a bug? :o


sv_rescue 1.
no team / t0
1. no /r -> finish
2. use /r after start, to reset to position after start -> finish
3. use /r after start, to reset to position before start -> finish
in team
1. no /r -> finish
2. use /r after start, to reset to position after start -> finish
3. use /r after start, to reset to position before start -> no finish ??
here is a video showing all 6 cases: https://streamable.com/8d8q0n
In the third case the timer resets back to as if you'd never touched the start line. However, when not in a team the timer starts again when the start line is touched. However, this does not work when you are in a team. Is this intended behaviour or a bug? :o 


























































using namespace std .. but that only hides it, and doesnt get rid of it (edited)































































1
























































































































println!("tune ground_control_speed {}\ntune ground_control_accel {}\ntune ground_friction {}\ntune ground_jump_impulse {}\ntune air_jump_impulse {}\ntune air_control_speed {}\ntune air_control_accel {}\ntune air_friction {}\ntune hook_fire_speed {}\ntune hook_drag_accel {}\ntune hook_drag_speed {}\ntune gravity {}\ntune velramp_start {}\ntune velramp_range {}\ntune gun_speed {}\ntune gun_lifetime {}\ntune grenade_speed {}\ntune grenade_lifetime {}\ntune laser_bounce_delay {}\ntune jetpack_strength {}\ntune shotgun_strength {}\ntune explosion_strength {}\ntune hammer_strength {}\ntune hook_duration {}\ntune hammer_fire_delay {}\ntune gun_fire_delay {}\ntune shotgun_fire_delay {}\ntune grenade_fire_delay {}\ntune laser_fire_delay {}\ntune ninja_fire_delay {}\ntune hammer_hit_fire_delay {}",
new_tunes.ground_control_speed, new_tunes.ground_control_accel, new_tunes.ground_friction, new_tunes.ground_jump_impulse, new_tunes.air_jump_impulse, new_tunes.air_control_speed, new_tunes.air_control_accel, new_tunes.air_friction, new_tunes.hook_fire_speed, new_tunes.hook_drag_accel, new_tunes.hook_drag_speed, new_tunes.gravity, new_tunes.velramp_start, new_tunes.velramp_range, new_tunes.gun_speed, new_tunes.gun_lifetime, new_tunes.grenade_speed, new_tunes.grenade_lifetime, new_tunes.laser_bounce_delay, new_tunes.jetpack_strength, new_tunes.shotgun_strength, new_tunes.explosion_strength, new_tunes.hammer_strength, new_tunes.hook_duration, new_tunes.hammer_fire_delay, new_tunes.gun_fire_delay, new_tunes.shotgun_fire_delay, new_tunes.grenade_fire_delay, new_tunes.laser_fire_delay, new_tunes.ninja_fire_delay, new_tunes.hammer_hit_fire_delay); MATE WHAT IS THIS PRINTLN MACRO













println!("tune ground_control_speed {}\ntune ground_control_accel {}\ntune ground_friction {}\ntune ground_jump_impulse {}\ntune air_jump_impulse {}\ntune air_control_speed {}\ntune air_control_accel {}\ntune air_friction {}\ntune hook_fire_speed {}\ntune hook_drag_accel {}\ntune hook_drag_speed {}\ntune gravity {}\ntune velramp_start {}\ntune velramp_range {}\ntune gun_speed {}\ntune gun_lifetime {}\ntune grenade_speed {}\ntune grenade_lifetime {}\ntune laser_bounce_delay {}\ntune jetpack_strength {}\ntune shotgun_strength {}\ntune explosion_strength {}\ntune hammer_strength {}\ntune hook_duration {}\ntune hammer_fire_delay {}\ntune gun_fire_delay {}\ntune shotgun_fire_delay {}\ntune grenade_fire_delay {}\ntune laser_fire_delay {}\ntune ninja_fire_delay {}\ntune hammer_hit_fire_delay {}",
new_tunes.ground_control_speed, new_tunes.ground_control_accel, new_tunes.ground_friction, new_tunes.ground_jump_impulse, new_tunes.air_jump_impulse, new_tunes.air_control_speed, new_tunes.air_control_accel, new_tunes.air_friction, new_tunes.hook_fire_speed, new_tunes.hook_drag_accel, new_tunes.hook_drag_speed, new_tunes.gravity, new_tunes.velramp_start, new_tunes.velramp_range, new_tunes.gun_speed, new_tunes.gun_lifetime, new_tunes.grenade_speed, new_tunes.grenade_lifetime, new_tunes.laser_bounce_delay, new_tunes.jetpack_strength, new_tunes.shotgun_strength, new_tunes.explosion_strength, new_tunes.hammer_strength, new_tunes.hook_duration, new_tunes.hammer_fire_delay, new_tunes.gun_fire_delay, new_tunes.shotgun_fire_delay, new_tunes.grenade_fire_delay, new_tunes.laser_fire_delay, new_tunes.ninja_fire_delay, new_tunes.hammer_hit_fire_delay); MATE WHAT IS THIS PRINTLN MACRO 
2













for i in new_tunes println!(i) 









for tune, value in pairs(new_tunes) do print("tune " .. tune .. " " .. value) end
totally Rust I swear




for tune, value in pairs(new_tunes) do print("tune " .. tune .. " " .. value) end
totally Rust I swear 




1





macro_rules! formatTune {
($name:expr, $value:expr) => {
concat!("tune ", $name, " ", &$value.to_string(), "\n")
};
}
print!(
formatTune!("ground_control_speed", new_tunes.ground_control_speed) +
formatTune!("ground_control_accel", new_tunes.ground_control_accel) +
formatTune!("ground_friction", new_tunes.ground_friction) +
formatTune!("ground_jump_impulse", new_tunes.ground_jump_impulse) +
formatTune!("air_jump_impulse", new_tunes.air_jump_impulse) +
formatTune!("air_control_speed", new_tunes.air_control_speed) +
formatTune!("air_control_accel", new_tunes.air_control_accel) +
formatTune!("air_friction", new_tunes.air_friction) +
formatTune!("hook_fire_speed", new_tunes.hook_fire_speed) +
formatTune!("hook_drag_accel", new_tunes.hook_drag_accel) +
formatTune!("hook_drag_speed", new_tunes.hook_drag_speed) +
formatTune!("gravity", new_tunes.gravity) +
formatTune!("velramp_start", new_tunes.velramp_start) +
formatTune!("velramp_range", new_tunes.velramp_range) +
formatTune!("gun_speed", new_tunes.gun_speed) +
formatTune!("gun_lifetime", new_tunes.gun_lifetime) +
formatTune!("grenade_speed", new_tunes.grenade_speed) +
<DISCORD LIMIT>
formatTune!("explosion_strength", new_tunes.explosion_strength) +
formatTune!("hammer_strength", new_tunes.hammer_strength) +
formatTune!("hook_duration", new_tunes.hook_duration) +
formatTune!("hammer_fire_delay", new_tunes.hammer_fire_delay) +
formatTune!("gun_fire_delay", new_tunes.gun_fire_delay) +
formatTune!("shotgun_fire_delay", new_tunes.shotgun_fire_delay) +
formatTune!("grenade_fire_delay", new_tunes.grenade_fire_delay) +
formatTune!("laser_fire_delay", new_tunes.laser_fire_delay) +
formatTune!("ninja_fire_delay", new_tunes.ninja_fire_delay) +
formatTune!("hammer_hit_fire_delay", new_tunes.hammer_hit_fire_delay)
)


macro_rules! formatTune {
($name:expr, $value:expr) => {
concat!("tune ", $name, " ", &$value.to_string(), "\n")
};
}
print!(
formatTune!("ground_control_speed", new_tunes.ground_control_speed) +
formatTune!("ground_control_accel", new_tunes.ground_control_accel) +
formatTune!("ground_friction", new_tunes.ground_friction) +
formatTune!("ground_jump_impulse", new_tunes.ground_jump_impulse) +
formatTune!("air_jump_impulse", new_tunes.air_jump_impulse) +
formatTune!("air_control_speed", new_tunes.air_control_speed) +
formatTune!("air_control_accel", new_tunes.air_control_accel) +
formatTune!("air_friction", new_tunes.air_friction) +
formatTune!("hook_fire_speed", new_tunes.hook_fire_speed) +
formatTune!("hook_drag_accel", new_tunes.hook_drag_accel) +
formatTune!("hook_drag_speed", new_tunes.hook_drag_speed) +
formatTune!("gravity", new_tunes.gravity) +
formatTune!("velramp_start", new_tunes.velramp_start) +
formatTune!("velramp_range", new_tunes.velramp_range) +
formatTune!("gun_speed", new_tunes.gun_speed) +
formatTune!("gun_lifetime", new_tunes.gun_lifetime) +
formatTune!("grenade_speed", new_tunes.grenade_speed) +
<DISCORD LIMIT>
formatTune!("explosion_strength", new_tunes.explosion_strength) +
formatTune!("hammer_strength", new_tunes.hammer_strength) +
formatTune!("hook_duration", new_tunes.hook_duration) +
formatTune!("hammer_fire_delay", new_tunes.hammer_fire_delay) +
formatTune!("gun_fire_delay", new_tunes.gun_fire_delay) +
formatTune!("shotgun_fire_delay", new_tunes.shotgun_fire_delay) +
formatTune!("grenade_fire_delay", new_tunes.grenade_fire_delay) +
formatTune!("laser_fire_delay", new_tunes.laser_fire_delay) +
formatTune!("ninja_fire_delay", new_tunes.ninja_fire_delay) +
formatTune!("hammer_hit_fire_delay", new_tunes.hammer_hit_fire_delay)
) 




macro_rules! formatTune {
($name:expr, $value:expr) => {
concat!("tune ", $name, " ", &$value.to_string(), "\n")
};
}
print!(
formatTune!("ground_control_speed", new_tunes.ground_control_speed) +
formatTune!("ground_control_accel", new_tunes.ground_control_accel) +
formatTune!("ground_friction", new_tunes.ground_friction) +
formatTune!("ground_jump_impulse", new_tunes.ground_jump_impulse) +
formatTune!("air_jump_impulse", new_tunes.air_jump_impulse) +
formatTune!("air_control_speed", new_tunes.air_control_speed) +
formatTune!("air_control_accel", new_tunes.air_control_accel) +
formatTune!("air_friction", new_tunes.air_friction) +
formatTune!("hook_fire_speed", new_tunes.hook_fire_speed) +
formatTune!("hook_drag_accel", new_tunes.hook_drag_accel) +
formatTune!("hook_drag_speed", new_tunes.hook_drag_speed) +
formatTune!("gravity", new_tunes.gravity) +
formatTune!("velramp_start", new_tunes.velramp_start) +
formatTune!("velramp_range", new_tunes.velramp_range) +
formatTune!("gun_speed", new_tunes.gun_speed) +
formatTune!("gun_lifetime", new_tunes.gun_lifetime) +
formatTune!("grenade_speed", new_tunes.grenade_speed) +
<DISCORD LIMIT>
formatTune!("explosion_strength", new_tunes.explosion_strength) +
formatTune!("hammer_strength", new_tunes.hammer_strength) +
formatTune!("hook_duration", new_tunes.hook_duration) +
formatTune!("hammer_fire_delay", new_tunes.hammer_fire_delay) +
formatTune!("gun_fire_delay", new_tunes.gun_fire_delay) +
formatTune!("shotgun_fire_delay", new_tunes.shotgun_fire_delay) +
formatTune!("grenade_fire_delay", new_tunes.grenade_fire_delay) +
formatTune!("laser_fire_delay", new_tunes.laser_fire_delay) +
formatTune!("ninja_fire_delay", new_tunes.ninja_fire_delay) +
formatTune!("hammer_hit_fire_delay", new_tunes.hammer_hit_fire_delay)
) 




1
1


macro_rules! formatTune {
($name:expr, $value:expr) => {
concat!("tune ", $name, " ", &$value.to_string(), "\n")
};
}
print!(
formatTune!("ground_control_speed", new_tunes.ground_control_speed) +
formatTune!("ground_control_accel", new_tunes.ground_control_accel) +
formatTune!("ground_friction", new_tunes.ground_friction) +
formatTune!("ground_jump_impulse", new_tunes.ground_jump_impulse) +
formatTune!("air_jump_impulse", new_tunes.air_jump_impulse) +
formatTune!("air_control_speed", new_tunes.air_control_speed) +
formatTune!("air_control_accel", new_tunes.air_control_accel) +
formatTune!("air_friction", new_tunes.air_friction) +
formatTune!("hook_fire_speed", new_tunes.hook_fire_speed) +
formatTune!("hook_drag_accel", new_tunes.hook_drag_accel) +
formatTune!("hook_drag_speed", new_tunes.hook_drag_speed) +
formatTune!("gravity", new_tunes.gravity) +
formatTune!("velramp_start", new_tunes.velramp_start) +
formatTune!("velramp_range", new_tunes.velramp_range) +
formatTune!("gun_speed", new_tunes.gun_speed) +
formatTune!("gun_lifetime", new_tunes.gun_lifetime) +
formatTune!("grenade_speed", new_tunes.grenade_speed) +
<DISCORD LIMIT>
formatTune!("explosion_strength", new_tunes.explosion_strength) +
formatTune!("hammer_strength", new_tunes.hammer_strength) +
formatTune!("hook_duration", new_tunes.hook_duration) +
formatTune!("hammer_fire_delay", new_tunes.hammer_fire_delay) +
formatTune!("gun_fire_delay", new_tunes.gun_fire_delay) +
formatTune!("shotgun_fire_delay", new_tunes.shotgun_fire_delay) +
formatTune!("grenade_fire_delay", new_tunes.grenade_fire_delay) +
formatTune!("laser_fire_delay", new_tunes.laser_fire_delay) +
formatTune!("ninja_fire_delay", new_tunes.ninja_fire_delay) +
formatTune!("hammer_hit_fire_delay", new_tunes.hammer_hit_fire_delay)
) 





struct Tunes {
ground_control_speed: f32,
ground_control_accel: f32,
ground_friction: f32,
ground_jump_impulse: f32,
air_jump_impulse: f32,
// Add more attributes as needed
}
impl Tunes {
// Method to return an iterator of the attribute names and values
fn attributes(&self) -> impl Iterator<Item = (&str, f32)> {
// Return an iterator over tuples of field names and values
vec![
("ground_control_speed", self.ground_control_speed),
("ground_control_accel", self.ground_control_accel),
("ground_friction", self.ground_friction),
("ground_jump_impulse", self.ground_jump_impulse),
("air_jump_impulse", self.air_jump_impulse),
// Add more fields here if necessary
]
.into_iter()
}
}
fn main() {
// Instantiate the struct
let new_tunes = Tunes {
ground_control_speed: 1.0,
ground_control_accel: 2.0,
ground_friction: 0.9,
ground_jump_impulse: 5.0,
air_jump_impulse: 3.0,
};
// Iterate over the attributes and print the names and values
for (name, value) in new_tunes.attributes() {
println!("{}: {}", name, value);
}
}
this is cleaner imo













fn attributes(&self) -> impl Iterator<Item = (&str, f32)> {
// Return an iterator over tuples of field names and values
vec![
("ground_control_speed", self.ground_control_speed),
("ground_control_accel", self.ground_control_accel),
("ground_friction", self.ground_friction),
("ground_jump_impulse", self.ground_jump_impulse),
("air_jump_impulse", self.air_jump_impulse),
// Add more fields here if necessary
]
.into_iter()
}
why return a iterator, u can just return a reference to a &[] and avoid a heap alloc

fn attributes(&self) -> impl Iterator<Item = (&str, f32)> {
// Return an iterator over tuples of field names and values
vec![
("ground_control_speed", self.ground_control_speed),
("ground_control_accel", self.ground_control_accel),
("ground_friction", self.ground_friction),
("ground_jump_impulse", self.ground_jump_impulse),
("air_jump_impulse", self.air_jump_impulse),
// Add more fields here if necessary
]
.into_iter()
}
why return a iterator, u can just return a reference to a &[] and avoid a heap alloc 



fn main() {
let args: Vec<String> = env::args().collect();
if args.len() <= 1 {
eprintln!("Usage: tune_calculator <scale>");
return;
}
let scale = args[1].parse::<f32>().unwrap_or_else(|_| {
eprintln!("Invalid scale value.");
std::process::exit(1);
});
let tick_speed = ((1.0 / scale) * 50.0) as i32;
let tunes = calculate_tunes(tick_speed);
println!("{:#?}", tunes);
} (edited)




1

fn main() {
let args: Vec<String> = env::args().collect();
if args.len() <= 1 {
eprintln!("Usage: tune_calculator <scale>");
return;
}
let scale = args[1].parse::<f32>().unwrap_or_else(|_| {
eprintln!("Invalid scale value.");
std::process::exit(1);
});
let tick_speed = ((1.0 / scale) * 50.0) as i32;
let tunes = calculate_tunes(tick_speed);
println!("{:#?}", tunes);
} (edited)




use crate::tokens_cfg::{
ConfigToken,
ConfigLine,
Value
};
use crate::tokens_cpp::{
LexicalError,
};
grammar;
extern {
type Location = usize;
type Error = LexicalError;
enum ConfigToken {
"string lit" => ConfigToken::StringLiteral(<String>),
"ident" => ConfigToken::Identifier(<String>),
"int" => ConfigToken::Integer(<i64>),
"ip" => ConfigToken::IP(<String>),
"endline" => ConfigToken::Endline,
}
}
pub Configs: Vec<ConfigLine> = {
<entries:Entry*> => entries
}
Value: Value = {
<x:"string lit"> => Value::String(x),
<x:"int"> => Value::Int(x),
<x:"ident"> => Value::Key(x),
<x:"ip"> => Value::IP(x),
}
Entry: ConfigLine = {
<name:"ident"> <values:Value*> "endline" => {
ConfigLine {
name,
values
}
}
}






/// Parses a ddnet / teeworlds config file. Like `settings_ddnet.cfg`
pub fn parse_config(
settings_file: &str,
) -> Result<Vec<ConfigLine>, ParseError<usize, ConfigToken, LexicalError>> {
let lexer = ConfigLexer::new(settings_file);
let parser = grammar_config::ConfigsParser::new();
parser.parse(lexer)
}










/// Parses a ddnet / teeworlds config file. Like `settings_ddnet.cfg`
pub fn parse_config(
settings_file: &str,
) -> Result<Vec<ConfigLine>, ParseError<usize, ConfigToken, LexicalError>> {
let lexer = ConfigLexer::new(settings_file);
let parser = grammar_config::ConfigsParser::new();
parser.parse(lexer)
} 



















/// An already loaded `config_variables.h` file, ready to be parsed.
///
/// There are no guarantees this is up to date.
pub static BUILTIN_CONFIG_VARIABLES_H: &str = include_str!("../config_variables.h");
/// An already loaded `variables.h` file, ready to be parsed.
///
/// There are no guarantees this is up to date.
pub static BUILTIN_VARIABLES_H: &str = include_str!("../variables.h");































fn main() {
let args: Vec<String> = env::args().collect();
if args.len() <= 1 {
eprintln!("Usage: tune_calculator <scale>");
return;
}
let scale = args[1].parse::<f32>().unwrap_or_else(|_| {
eprintln!("Invalid scale value.");
std::process::exit(1);
});
let tick_speed = ((1.0 / scale) * 50.0) as i32;
let tunes = calculate_tunes(tick_speed);
println!("{:#?}", tunes);
} (edited)











































































































[ 53%] Building CXX object CMakeFiles/game-client.dir/src/game/generated/checksum.cpp.o
do... we really need a checksum



std::map to sparsely store only the used CItemTypeInfos on the heap instead of using an std::array to store all 65536 entries (MAX_ITEM_TYPES) on the stack. This reduces the (stack) memory usage of CDataFileWriters from 786512 to 128 bytes.
1



ddnet-maps/types/solo/maps/Masquerade.map in the editor, you receive the following screen:
!screenshot_2024-11-14_11-58-38
I don't think this is a map-issue, because this is used here to put structure into the tun...





SLabelProperties Props;
Props.m_MaxWidth = Label.w - 5.0f;
Ui()->DoLabel(&Label, pSkinToBeDraw->GetName(), 12.0f, TEXTALIGN_ML, Props);


SLabelProperties Props;
Props.m_MaxWidth = Label.w - 5.0f;
Ui()->DoLabel(&Label, pSkinToBeDraw->GetName(), 12.0f, TEXTALIGN_ML, Props); 


tooltip.cppGetBoundingBoxTextContainer instead of TextBoundingBox

enum
{
VOTE_DESC_LENGTH = 64,
VOTE_CMD_LENGTH = 512,
VOTE_REASON_LENGTH = 16,
MAX_VOTE_OPTIONS = 8192,
};





constexpr float FontSize = 14.0f;
constexpr float Margin = 5.0f;
constexpr float Padding = 5.0f;

enum
{
VOTE_DESC_LENGTH = 64,
VOTE_CMD_LENGTH = 512,
VOTE_REASON_LENGTH = 16,
MAX_VOTE_OPTIONS = 8192,
}; 
















CUi::Screen






618951.125000 618951.125000const float Padding = 2.0f;
CTextCursor Cursor;
Cursor.m_FontSize = 12.0f * CUi::ms_FontmodHeight;
Cursor.m_LineWidth = List.w - Padding * 2.0f;
Cursor.m_StartX = List.x + Padding;
Cursor.m_StartY = List.y + Padding;
STextContainerIndex TextContainerIndex;
const unsigned OldRenderFlags = TextRender()->GetRenderFlags();
TextRender()->SetRenderFlags(OldRenderFlags | TEXT_RENDER_FLAG_ONE_TIME_USE);
TextRender()->CreateTextContainer(TextContainerIndex, &Cursor, pText);
TextRender()->SetRenderFlags(OldRenderFlags);
const STextBoundingBox BoundingBox = TextRender()->GetBoundingBoxTextContainer(TextContainerIndex);
CUIRect Label;
List.HSplitTop(BoundingBox.m_H + Padding * 2.0f, &Label, &List);
s_ScrollRegion.AddRect(Label);
printf("%f %f\n", BoundingBox.m_H, BoundingBox.m_H);
TextRender()->RenderTextContainer(TextContainerIndex, TextRender()->GetTextColor(), TextRender()->GetTextOutlineColor());







const float FontSize = 10.0f;
then the label has a size of 12.0f * CUi::ms_FontmodHeight == 9.6fList.HSplitTop(50.0f, &List, &Label);
s_ScrollRegion.AddRect(Label);
uhh its not adding any space?







MAYBE_UNUSED static const char *FONT_ICON_QUESTION = "?";


MAYBE_UNUSED static const char *FONT_ICON_QUESTION = "?"; 

const char *pText;
switch(FriendType)
{
case FRIEND_PLAYER_ON:
pText = Localize("Add friends by clicking on their name in the player list or at the bottom");
break;
case FRIEND_CLAN_ON:
pText = Localize("To show your clanmates here, add a friend with only the clan name set");
break;
case FRIEND_OFF:
pText = Localize("Offline friends and clanmates will appear here");
break;
default:
pText = Localize("None");
break;
}
GameClient()->m_Tooltips.DoToolTip((char*)this + FriendType, &Header, pText, Header.w);




for(size_t FriendType = 0; FriendType < NUM_FRIEND_TYPES; ++FriendType) {
CUIRect Header, DeleteIcon, QuestionIcon, Label;
List.HSplitTop(ms_ListheaderHeight, &Header, &List);
m_ScrollRegion.AddRect(Header);
GameClient()->m_Tooltips.DoToolTip((char*)this + FriendType, &Header, "HELLOOO", Header.w);
} (edited)


GameClient()->m_Tooltips.DoToolTip(&s_aListExtended[FriendType], &Header, "HELLOOO");




(char*)this + FriendType even does










&s_aListExtended[FriendType]
is the same (if the bools are sized as 1 byte, they might be bigger idk, amnt compiler) (edited)





&s_aListExtended[FriendType] cuz it works but idk why equally big random numbers dont work