<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 worksCGameWorld::GameTick()
function. You can convert ticks to seconds by dividing the value by SERVER_TICK_SPEED
(50). Senior Global Key Account Manager
?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... 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? :osv_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)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 MACROprintln!("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 for i in new_tunes println!(i)
for tune, value in pairs(new_tunes) do print("tune " .. tune .. " " .. value) end
totally Rust I swearfor tune, value in pairs(new_tunes) do print("tune " .. tune .. " " .. value) end
totally Rust I swear 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)
)
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)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 checksumstd::map
to sparsely store only the used CItemTypeInfo
s 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 CDataFileWriter
s from 786512 to 128 bytes.
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.cpp
GetBoundingBoxTextContainer
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.125000
const 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.6f
List.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