00:10 < bridge> https://discord.com/channels/252358080522747904/1357114374640243160 Devs, please consider reading this article about the ramping spamming issue and give your opinions on that. 00:17 < bridge> ```cpp 00:17 < bridge> static constexpr const char *RESERVED_NAMES[] = { 00:17 < bridge> "CON", "PRN", "AUX", "NUL", 00:17 < bridge> "COM0", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", "COM¹", "COM²", "COM³", 00:17 < bridge> "LPT0", "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9", "LPT¹", "LPT²", "LPT³"}; 00:17 < bridge> for(const char *reserved_name : RESERVED_NAMES) 00:17 < bridge> { 00:17 < bridge> const char *prefix = str_startswith_nocase(str, reserved_name); 00:17 < bridge> if(prefix != nullptr && (prefix[0] == '\0' || prefix[0] == '.')) 00:17 < bridge> { 00:17 < bridge> return false; // Reserved name not allowed when it makes up the entire filename or when followed by period 00:17 < bridge> } 00:17 < bridge> } 00:17 < bridge> ``` 00:17 < bridge> haha 00:17 < bridge> if you make a file for every name, this prevents windows machines from impldoing 00:49 < bridge> wdym 00:49 < bridge> if you make them all you’re allowed to do it? 01:24 < ws-client> @melon when fix BW it shows one gun ammo since a few years 01:31 < ws-client> also when fix shooting through walls 01:31 < ws-client> https://zillyhuhn.com/cs/.1743636691.png 01:33 < bridge> Would fixing shooting through walls not affect game physics in a meaningful way? 01:33 < bridge> Ok I'm guessing nobody has actually made use of this in a map but... you know 01:35 < ws-client> also why can i not see tees when zooming out in 2025 @melon ? 01:36 < ws-client> @inv41idu53rn4m3 i do not know a single other mod other than BW that managed to have the shooting through walls bug 01:37 < ws-client> with gun 01:37 < bridge> ohk then I'm gonna very much not care mwahaha 01:37 < ws-client> i am not talking about hammer or grenade, laser and shutgun 05:39 < bridge> That is on purpose ackthually 05:39 < bridge> We're still based on teeworlds, not ddnet 05:39 < bridge> :KEKW: 05:40 < bridge> why] 06:08 < bridge> when bw src2 06:50 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1357215589176971304/image.png?ex=67ef6504&is=67ee1384&hm=467891159aaccb671d8cb78ca8923d1eff2d3c0956ddbe1f100b72747f201334& 06:50 < bridge> D: 07:37 < bridge> gm other and all 07:37 < bridge> gm others and all 07:50 < bridge> where is the place where the output of something to the console is implemented (that is, the method that is called to write something to the console) 07:51 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1357230915725819985/image.png?ex=67ef734a&is=67ee21ca&hm=306eda82ec11ef09899c820842773cfc3e5c3ad6eea55496dd567226712bb35c& 08:07 < bridge> vscode has a go to definison button 08:07 < bridge> and it looks like your using vscode 08:15 < bridge> I guess it's clion 08:18 < bridge> yes 08:48 < bridge> morning peeps 08:49 < bridge> https://go.dev/blog/coretypes 09:01 < bridge> whats a core type? 09:01 < bridge> a builtin type like u32? 09:05 < bridge> > These rules are based on the notion of a core type which is defined roughly as follows: 09:05 < bridge> > 09:05 < bridge> > If a type is not a type parameter, its core type is just its underlying type. 09:06 < bridge> > If the type is a type parameter, the core type is the single underlying type of all the types in the type parameter’s type set. If the type set has different underlying types, the core type doesn’t exist. 09:30 < bridge> @sollybunny https://codedoc.ddnet.org/ 09:30 < bridge> we use doxygen btw 09:30 < bridge> comments should be doxygen compatible 09:31 < bridge> i guess jsdoc is same since it looks same 09:31 < bridge> https://www.doxygen.nl/manual/docblocks.html 09:31 < bridge> the style i went with is similar to what i saw as jsdocs already in there 09:32 < bridge> no jsdocs are not used xd its doxygen style, i am the one who added those comments btw 09:32 < bridge> docs here 09:33 < bridge> they look like jsdocs 09:33 < bridge> [pensivewobble](https://cdn.discordapp.com/emojis/805360623423586335.gif?size=48&animated=true&name=pensivewobble) 09:35 < bridge> whatever style taht was beind used beforehand has so much more blank space 09:36 < bridge> also my ide makes jsdoc look docs pretty 09:36 < bridge> also my ide makes jsdoc looking docs pretty 09:36 < bridge> we use doxygen docs :v 09:36 < bridge> needs to look good here https://codedoc.ddnet.org 09:36 < bridge> but i think ur changes are fine 09:36 < bridge> me calling them jsdocs is annoying you 09:36 < bridge> ye xd 09:37 < bridge> jsers out 09:37 < bridge> but they are *almost* identical 09:37 < bridge> just no {} in params 09:38 < bridge> its gonnat ake forever to get my changes merged 09:38 < bridge> minus the mass renaming, i guess thats fair, little reason to fuck up downstreams 09:38 < bridge> except some function names are completley nondescriptive 09:39 < bridge> we will see when we get there 10:05 < bridge> @sollybunny what is this issue about? Please add context, I can't make any sense of it, something with freeze and glue 10:09 < bridge> Live freeze is freeze where you can hook and shoot but not move 10:09 < bridge> For it to have the same display as freeze seems wrong 10:09 < bridge> I think adding a sticky effect could be cool 10:11 < bridge> put handcuffs on the feet 10:11 < bridge> put handcuffs on the feet (man am I bad at joking) 10:12 < bridge> didn't know about live freeze, I find the name also confusing 10:14 < bridge> That's not teeqorlds like 10:14 < bridge> Yeah it's ... Very niche 10:14 < bridge> I've updated the description 10:17 < bridge> What I mean by that idea is, that you can change the movement animation additionally for stuff like this. 10:17 < bridge> I made a custom movement andimation for ice depending on ground friction, maybe I should port it over and generalize it 😮 10:17 < bridge> What I mean by that idea is, that you can change the movement animation additionally for stuff like this. 10:17 < bridge> I made a custom movement animation for ice depending on ground friction, maybe I should port it over and generalize it 😮 10:18 < bridge> Handcuffs on the feet isn't very 10:18 < bridge> Cartoon violence 10:18 < bridge> There would be no feet snim cuz you can't move 10:25 < bridge> what I mean is you cut make the tee look like he sits or have his feet infront 10:25 < bridge> the lower part of a tee could be in ice :kek: 10:26 < bridge> the lower half of a tee could be in ice :kek: 11:18 < bridge> > I think the explicit checks are clearer; readability is more important than reducing duplicate code. 11:18 < bridge> @robyt3 sorry but hard disagree, more duplicated code leads to more duplicated bugs, and doesn't make anything easier to read if your files become extremely long like in this case 11:20 < bridge> Then you'll need to convince another maintainer to merge this 11:20 < bridge> okay this is also half the comment: I can also reintroduce some booleans for clearer checks 11:20 < bridge> I don't think one boolean for layer is any clean 11:21 < bridge> I don't think one boolean for each layer is any clean 11:25 < bridge> Just check each value individually with logical or in one condition, no need for the bool variables that were there before. But it should be "if layer is X, or Y, or Z" and not "if layer is less than 3" (in essence) 11:26 < bridge> hmm okay 👍 11:39 < bridge> I reintroduced IsEntityLayer and split the `or` conditions and must admit, it's better readable 12:24 < bridge> Will `Ui()->DoButtonLogic()` change the input rect's value? 12:26 < bridge> I did 3 completely the same splits 12:26 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1357300254533353662/IMG_20250403_182343.jpg?ex=67efb3de&is=67ee625e&hm=72a159cc69887f9d80836cae2218ce3ff6a14a44cb43d44f5bae4b8e1fabbdb1& 12:40 < bridge> Nothing now😅 12:41 < bridge> No, the buttons don't change the rects. Maybe you split based on the total height, but the total height changes after you split the first rect. Save the total height to a variable first. 12:43 < bridge> I accidentally give VSplitLeft one Rect twice 12:51 < bridge> HELLO 12:56 < bridge> hello 13:20 < bridge> https://blog.rust-lang.org/2025/04/03/Rust-1.86.0.html 13:23 < bridge> - Trait upcasting 13:23 < bridge> - HashMaps and slices now support indexing multiple elements mutably 13:23 < bridge> - Allow safe functions to be marked with the #[target_feature] attribute. 13:23 < bridge> - Debug assertions that pointers are non-null when required for soundness 13:23 < bridge> - Make missing_abi lint warn by default 13:23 < bridge> 13:23 < bridge> Stabilized APIs 13:23 < bridge> ``` 13:23 < bridge> {float}::next_down 13:23 < bridge> {float}::next_up 13:23 < bridge> <[_]>::get_disjoint_mut 13:23 < bridge> <[_]>::get_disjoint_unchecked_mut 13:23 < bridge> slice::GetDisjointMutError 13:23 < bridge> HashMap::get_disjoint_mut 13:23 < bridge> HashMap::get_disjoint_unchecked_mut 13:23 < bridge> NonZero::count_ones 13:23 < bridge> Vec::pop_if 13:24 < bridge> sync::Once::wait 13:24 < bridge> sync::Once::wait_force 13:24 < bridge> sync::OnceLock::wait 13:24 < bridge> ``` 13:24 < bridge> These APIs are now stable in const contexts: 13:24 < bridge> ``` 13:24 < bridge> hint::black_box 13:24 < bridge> io::Cursor::get_mut 13:24 < bridge> io::Cursor::set_position 13:24 < bridge> str::is_char_boundary 13:24 < bridge> str::split_at 13:24 < bridge> str::split_at_checked 13:24 < bridge> str::split_at_mut 13:24 < bridge> str::split_at_mut_checked 13:24 < bridge> @jupeyy_keks @learath2 pog 13:27 < bridge> Disjoint mut borrows on slices and hashmaps are very nice to have. Anything that makes the borrow checker more flexible is appreciated 13:27 < bridge> The borrow checker prevents simultaneous usage of references obtained from repeated calls to get_mut methods. To safely support this pattern the standard library now provides a get_disjoint_mut helper on slices and HashMap to retrieve mutable references to multiple elements simultaneously. 13:27 < bridge> ```rust 13:27 < bridge> let v = &mut [1, 2, 3]; 13:27 < bridge> if let Ok([a, b]) = v.get_disjoint_mut([0, 2]) { 13:27 < bridge> *a = 413; 13:28 < bridge> *b = 612; 13:28 < bridge> } 13:28 < bridge> assert_eq!(v, &[413, 2, 612]); 13:28 < bridge> ``` 13:28 < bridge> ```rust 13:28 < bridge> if let Ok([a, b]) = v.get_disjoint_mut([0..1, 1..3]) { 13:28 < bridge> a[0] = 8; 13:28 < bridge> b[0] = 88; 13:28 < bridge> b[1] = 888; 13:28 < bridge> } 13:28 < bridge> assert_eq!(v, &[8, 88, 888]); 13:28 < bridge> ``` 13:28 < bridge> I do wonder what prevents borrowchecker to figure this out at compile time itself. Especially with const indices 13:28 < bridge> @learath2 i think it may be a api function issue 13:29 < bridge> get_mut(idx) borrows mutable self 13:29 < bridge> wait 13:29 < bridge> let me check how they do this 13:29 < bridge> ```rust 13:29 < bridge> pub fn get_disjoint_mut( 13:29 < bridge> 13:29 < bridge> &mut self, 13:29 < bridge> 13:29 < bridge> indices: [I; N], 13:29 < bridge> 13:29 < bridge> ) -> Result<[&mut I::Output; N], GetDisjointMutError> 13:29 < bridge> 13:29 < bridge> where 13:29 < bridge> 13:29 < bridge> I: GetDisjointMutIndex + SliceIndex, 13:30 < bridge> 13:30 < bridge> { 13:30 < bridge> 13:30 < bridge> get_disjoint_check_valid(&indices, self.len())?; 13:30 < bridge> 13:30 < bridge> // SAFETY: The `get_disjoint_check_valid()` call checked that all indices 13:30 < bridge> 13:30 < bridge> // are disjunct and in bounds. 13:30 < bridge> 13:30 < bridge> unsafe { Ok(self.get_disjoint_unchecked_mut(indices)) } 13:30 < bridge> 13:30 < bridge> } 13:30 < bridge> ``` 13:30 < bridge> ```rust 13:30 < bridge> #[inline] 13:30 < bridge> 13:30 < bridge> pub unsafe fn get_disjoint_unchecked_mut( 13:30 < bridge> 13:30 < bridge> &mut self, 13:30 < bridge> 13:30 < bridge> indices: [I; N], 13:30 < bridge> 13:30 < bridge> ) -> [&mut I::Output; N] 13:30 < bridge> 13:30 < bridge> where 13:30 < bridge> 13:30 < bridge> I: GetDisjointMutIndex + SliceIndex, 13:30 < bridge> 13:30 < bridge> { 13:31 < bridge> 13:31 < bridge> // NB: This implementation is written as it is because any variation of 13:31 < bridge> 13:31 < bridge> // `indices.map(|i| self.get_unchecked_mut(i))` would make miri unhappy, 13:31 < bridge> 13:31 < bridge> // or generate worse code otherwise. This is also why we need to go 13:31 < bridge> 13:31 < bridge> // through a raw pointer here. 13:31 < bridge> i guess yeah unsafe 13:31 < bridge> borrow checker is still limited 13:31 < bridge> just provides a safe api for this 13:31 < bridge> ```rust 13:31 < bridge> #[inline] 13:32 < bridge> // SAFETY: The `get_disjoint_check_valid()` call checked that all indices 13:32 < bridge> // are disjunct and in bounds. 13:32 < bridge> unsafe { Ok(self.get_disjoint_unchecked_mut(indices)) } 13:32 < bridge> 13:32 < bridge> } 13:32 < bridge> ``` 13:32 < bridge> Yeah, that's what I'm curious about I guess. What is this limitation that is not allowing this 13:32 < bridge> I wonder if polonius has better support for it 13:38 < bridge> @learath2 @robyt3 can u check https://github.com/ddnet/ddnet/pull/10003 13:43 < bridge> @sollybunny 178 files changed 💀 :kek: 13:49 < bridge> :justatest: 13:49 < bridge> I will if I can get out of bed 13:49 < bridge> 👴 13:50 < bridge> time to maintain open source project old man 13:50 < bridge> We believe in you!!! You can do it!! 💪💪 📣 🎉 13:50 < bridge> 📣 🎉 14:04 < bridge> epyc, waited long for multi mut element. 14:04 < bridge> 14:04 < bridge> having to use split_mut was always hacky. 14:04 < bridge> 14:04 < bridge> Only obvious disadvantage is that it has runtime overhead: 14:05 < bridge> > This method does a O(n^2) check to check that there are no overlapping indices, so be careful when passing many indices. 14:05 < bridge> 14:05 < bridge> But still good for QOL 14:13 < bridge> true, there is a unchecked one tho but yeah its unsafe 14:13 < bridge> Hopefully the O(n^2) check gets optimized out for constant inputs 15:21 < bridge> @milkeeycat very wip for non generic traits 15:21 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1357344329676357873/image.png?ex=67efdcea&is=67ee8b6a&hm=6dbc1b534bf86f66f8fb8bfdce5bd205a9171f063b11fcde3d324375bc0564f3& 15:49 < bridge> @learath2 send help. I was testing if my cmp instructions were generating the same results as examples on https://llvm.org/docs/LangRef.html#icmp-instruction. Everything is the same except one example, it says that it returns `false` but my code returns `true` 15:49 < bridge> ``` 15:49 < bridge> = icmp ule i16 -4, 5 ; yields: result=false 15:49 < bridge> ``` 15:49 < bridge> 15:49 < bridge> Here's the assembly generated by mode code: 15:49 < bridge> ```x86asm 15:49 < bridge> mov r15b, -4 15:49 < bridge> cmp r15b, 5 15:49 < bridge> setle al 15:49 < bridge> ``` 15:52 < bridge> epyc 15:56 < bridge> @learath2 send help. I was testing if my cmp instructions were generating the same results as examples on https://llvm.org/docs/LangRef.html#icmp-instruction. Everything is the same except one example, it says that it returns `false` but my code returns `true` 15:56 < bridge> ``` 15:56 < bridge> = icmp ule i16 -4, 5 ; yields: result=false 15:56 < bridge> ``` 15:56 < bridge> 15:56 < bridge> Here's the assembly generated by my code: 15:56 < bridge> ```x86asm 15:56 < bridge> mov r15b, -4 15:56 < bridge> cmp r15b, 5 15:56 < bridge> setle al 15:56 < bridge> ``` 15:56 < bridge> You are checking the wrong flag 15:56 < bridge> :pepeW: 15:56 < bridge> Setle is for signed 15:57 < bridge> what 15:57 < bridge> You want setbe 15:57 < bridge> i thought setbe is for signed xd 15:58 < bridge> “less” and “greater” are used for signed comparisons, “below” and “above” are used for unsigned ones. At least in x86 16:00 < bridge> I just realized I can't read. I've read this 10 times and thought it said "The terms "above" and "below" are associated with the CF flag and refer to the relationship between two **signed** integer values" 16:00 < bridge> :pepeW: 16:01 < bridge> 😛 16:04 < bridge> The carry flag is involved with unsigned comparisons, because comparison is technically just a subtraction. If an unsigned number is larger than another, subtraction will cause an underflow, that’s what we are detecting with the CF. SF is involved with signed comparisons because we want to know the sign of the result of the subtraction 16:10 < bridge> 😛 18:00 < bridge> hey since my last arch system update my cursor isn't locked into ddnet anymore. does anybody have a solution or the same problem? am using i3 18:00 < bridge> the mouse goes outside to my next screen and then gets flung back into ddnet. if i move my mouse hard enough it completely escapes 18:09 < bridge> this starts happening when i switch workspaces 18:09 < bridge> maybe its an i3 issue 18:09 < bridge> gonna try downgrade 18:32 < bridge> https://github.com/rust-lang/rustfmt/issues/3377 rustfmt trying to compete with ddnet on having old issues 18:32 < bridge> 6 years for stabilization is wild 😄 18:33 < bridge> https://github.com/ddnet/ddnet/issues/2091#issuecomment-2772567274 it's `sdl2-compat` 18:34 < bridge> And arch for some reason is so confident that `sdl2-compat` is perfect that they don't even provide `sdl2` anymore. You'll have to build it yourself 18:35 < bridge> downgrading i3-wm worked xd 18:35 < bridge> thx 18:36 < bridge> Perhaps it's the specific combination of `sdl2-compat` and some wm behaviour that makes it happen 18:39 < bridge> nv 18:39 < bridge> m 18:39 < bridge> its happening again 18:40 < bridge> yeah figured since it was happening to that person and he tried 2 different tiling wms and 2 different versions of each 18:40 < bridge> Maybe it's a `sdl2-compat` + tiling wm issue. Since I figure other people use arch but don't have this problem 18:41 < bridge> @robyt3 Thank you for merging ❤️ I hope I didn't sound to harsh before 18:52 < bridge> hmm i use sdl2-compat and hyprland - i dont have that issue (i have the issue of ddnet not letting go tho) xD 18:57 < bridge> Maybe it's isolated to X then, wayland might be handling workspaces differently, or maybe events are handled on wayland completely differently to begin with 18:57 < bridge> I might build `sdl2-compat` myself and see if I can reproduce then fix it in sdl 18:59 < bridge> or we may just get sdl3 to work kekekekek 18:59 < bridge> yes pls xd 19:00 < bridge> solly picked it up from ryo (which i didnt really understand because he was gonna continue working on it no?) 19:00 < bridge> 19:00 < bridge> teero you could do great things if you fixed the implementation and make sdl3 run 19:00 < bridge> just sayin 19:00 < bridge> enough c99 for you 19:02 < bridge> fuk u im not done optimizing 19:02 < bridge> im scratching 5m 19:03 < bridge> okay i did and it works thx 19:07 < bridge> how to i can add proxy in client 19:10 < bridge> holy shit 19:11 < bridge> OOOH I FOROT TO BENCH 19:11 < bridge> how could you 19:11 < bridge> make a bench right now!!! 19:12 < bridge> otherwise how will people sit outside 19:12 < bridge> i haven't uploaded lol 19:12 < bridge> not the newest version 19:12 < bridge> yeah i know but its against jupstis current cpu 19:12 < bridge> ah yea right 19:12 < bridge> melon didnt u have like a cool looking `n` 19:13 < bridge> i swear to god teero pls static link 19:13 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1357402700827983993/image.png?ex=67f01347&is=67eec1c7&hm=b3a65d3f2d8b745c3d7c65aea649832599c2bb0708d5b164798a5757e68f6baa& 19:13 < bridge> shitgame 19:13 < bridge> nah xd 19:13 < bridge> go install opemmp 19:13 < bridge> go install openmp 19:14 < bridge> ah lol you're on nix xD 19:14 < bridge> then good luck 19:15 < bridge> gcc openmp was smh staticly linked or you just had it 19:15 < bridge> but clang openmp is smh different 19:16 < bridge> LLVM OpenMP i assume? 19:16 < bridge> 19:16 < bridge> i cant install help, 19:16 < bridge> 19:16 < bridge> libomp5 doesnt provide libomp.so, neither does libomp5-19 19:16 < bridge> on arch its just called openmp 19:16 < bridge> :angy: 19:23 < bridge> what font does ddnet use by default to render player names? 19:26 < furo> See `data/fonts/index.json`. It will default to `DejaVu Sans`, but use others for CJK. 19:27 < bridge> Any web people here? Svelte knower would be a bonus 19:27 < bridge> me a bit 19:27 < bridge> never done anything big in svelte though 19:30 < bridge> cjk? 19:31 < bridge> I guess I'll put the question out there and people can comment if they have an opinion: 19:31 < bridge> 19:31 < bridge> I have a component that behaves almost like a checkbox, I currently bind a bool variable to one of it's props and on click it will flip that prop. I then have an array of bools that keep track of all the "checkboxes". The amount of checkboxes is not constant. 19:31 < bridge> 19:31 < bridge> Do you think the bound variable is a sane concept, or should I instead wire up a callback and handle the logic on the parent? 19:31 < bridge> Chinese Japanese Korean 19:31 < bridge> ah 19:32 < bridge> wait how does that work, i thought only 1 font is used at a time 19:33 < bridge> what about player names with chinese and latin characters in them 19:33 < bridge> 19:36 < bridge> i think it's the exact use of the bind feature in svelte 19:37 < bridge> is this similar to what you have now? https://svelte.dev/playground/hello-world#H4sIAAAAAAAAA3VQwW6DMAz9Fcs7sEmo3CndVE2T9gHbCXoI4LbRQhIRd2VC_PsSStdSrafEz37Pfq9HLRrCFN9JKQNH06oaHqmWTPUTxriVihymeY_8Y8NcADw-sdbWLtw3KQ5YKRz9h1dGM2n2Mpi5qpWWnwtdsGysaRk-zG6nCLataaDARXKqJ3aBSz_qhxUxVHuqvkrTkYMV5NweKIatUM4_V8VmCUkCb51orJd1LLyKzpLLYt0_kKj213LCnSqqY5BD2JdNZ5VS1-nUW_UXSi43AyRerk-CmOd4o0wdYxpuGeI7gc3czTO7bd2Jjboxtr9AqPZpjM6XNz4zJUpSIymT2h4YwkmrAs82Cpz5Gyf7s 19:38 < bridge> Yep, only difference is that I generate the array 19:40 < bridge> I've been thinking about introducing some extra behaviour and it's not exactly easy like this though. Like I want to unselect all other checkboxes if a checkbox is doubleclicked 19:40 < bridge> it was abandoned for a while 19:40 < bridge> sdl3 runs fine it just has a few issues 19:40 < bridge> sdl3 does not fix the mouse escape window problem 19:40 < bridge> The CJK font depends on the selected language, so you'd see some incorrect characters if someone write a message in another CJK language. I don't know why the Unicode consortium decided to assign the same unicode to visually distinct characters and decide that you need meta-knowledge about the language to render correctly. 19:41 < bridge> which i would like help with >< 19:42 < bridge> ah, i was thinking theres shenanigans about how to render each char in the player name with different font so the character shows up 19:42 < bridge> :heh: all good ig 19:43 < bridge> seems easy enough https://svelte.dev/playground/hello-world#H4sIAAAAAAAAA3VR0W6DMAz8FSt7oJVQeafQaZom7QO2p1JNAUwbNSQRcVcmxL8vAbqWan0CX-zz3bljitfIYvaOUmo460aWsMBSEJZLFrJKSLQs3naMfozv84DDp6kXY1b2GyV5LOcW_8MLrQgVORqW2KIRhjaZykjURjcEH3q_lwhVo2vI2Coa62k6Y2vX6polEhQHLI65btFCCltqThhCxaV1n5tit4YogreW18bRWuKOZaCoTqogoRU0aJEWS-g8mtGM9lqsam4WX5BuRtqlF0J9ppLo6kF1T8iLw60ybscKyxBE72eSyaFWcZnLQorimHaDhh5yocp46k-7K81W7HqI3Iou8gscj8uRsCUWe6t9-OAes_DmJ7l_enAVbIer_ 19:43 < bridge> damn this link is long 19:43 < bridge> It just checks the default font, language variant if set, and fallback font for a glyph for the given unicode and returns first match 19:44 < bridge> How do I build a client and server for Windows if I'm building it on Linux? 19:44 < bridge> :justatest: 19:44 < bridge> use mingw 19:44 < furo> @filoqcus it's explained somewhere in the README 19:45 < bridge> "all other" part is omited from this, but yes that was my line of thinking, but then I thought if I have to have the logic leak out of the component with the double click handler, should I perhaps just leak all of it out and handle the single click outside too? 19:46 < bridge> I have errors with this 19:46 < bridge> ``` 19:46 < bridge> -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/mingw64.toolchain 19:46 < bridge> ``` 19:46 < bridge> you *can* just push to a gh repo and the actions will build a windows binary 19:46 < bridge> Well you'd have to show the errors 😄 19:47 < bridge> i suppose it actually might be better if you forward the onclick event too 19:48 < bridge> i don't think he will 19:48 < bridge> bot client code isn't compiling with mingw pls help! 19:48 < bridge> but on the other hand `checked` is a core property of the input field 19:48 < bridge> soooo 19:49 < bridge> i dont like web development 19:49 < bridge> because you have to figure out stuff that does not matter 19:49 < bridge> and spend hours understanding framework features 19:49 < bridge> :feelsbadman: 19:50 < bridge> real 19:50 < bridge> i agree 19:50 < bridge> and new web framework comes out every other week 19:51 < bridge> javascript was a mistake 19:51 < bridge> still is 19:58 < bridge> :brownbear: :poggers2: 20:04 < bridge> Let's ban web 20:05 < bridge> yes 20:05 < bridge> and invent 50 new protocols 20:05 < bridge> with additional 50 new kinds of browsers for them 20:06 < bridge> no, we go back to sending telegrams 20:07 < bridge> ``` 20:07 < bridge> -- Configuring done (4.0s) 20:07 < bridge> CMake Error in CMakeLists.txt: 20:07 < bridge> IMPORTED_IMPLIB not set for imported target "GTest::gtest" configuration 20:07 < bridge> "Release". 20:07 < bridge> 20:07 < bridge> 20:07 < bridge> -- Generating done (0.1s) 20:07 < bridge> CMake Generate step failed. Build files cannot be regenerated correctly. 20:07 < bridge> ``` 20:10 < bridge> What version of cmake is this, and show me the entire cmake output 20:11 < bridge> cmake version 3.31.6 20:12 < bridge> What's the “entire cmake output”? 20:12 < bridge> The cmake command you used + all the output it generated 20:13 < bridge> Like is this all the output? It should have generated more text before `-- Configuring done (4.0s)` 20:13 < bridge> ```txt 20:13 < bridge> ❯ cmake -DCMAKE_TOOLCHAIN_FILE=/home/filoqcus/CLionProjects/ddnet/cmake/toolchains/mingw64.toolchain . 20:13 < bridge> -- Using lld linker 20:13 < bridge> -- Could NOT find Crypto (missing: CRYPTO_LIBRARY CRYPTO_INCLUDEDIR) 20:13 < bridge> -- ******** DDNet ******** 20:13 < bridge> -- Target OS: windows 20:13 < bridge> -- Compiler: /usr/bin/x86_64-w64-mingw32-g++ 20:13 < bridge> -- Rust version: rustc 1.85.1 (4eb161250 2025-03-15) (Arch Linux rust 1:1.85.1-1) 20:13 < bridge> -- Build type: Release 20:14 < bridge> -- Dependencies: 20:14 < bridge> -- * Curl not found (using bundled version) 20:14 < bridge> -- * FFmpeg not found (using bundled version) 20:14 < bridge> -- * Freetype not found (using bundled version) 20:14 < bridge> -- * Git found 20:14 < bridge> -- * Glew not found (using bundled version) 20:14 < bridge> -- * GTest found 20:14 < bridge> -- * Ogg found 20:14 < bridge> -- * OpenSSL Crypto not found 20:14 < bridge> -- * Opus found 20:14 < bridge> -- * Opusfile not found (using bundled version) 20:14 < bridge> -- * PNG not found (using bundled version) 20:14 < bridge> -- * Python3 found 20:14 < bridge> -- * SDL2 not found (using bundled version) 20:14 < bridge> -- * SQLite3 not found (using bundled version) 20:14 < bridge> -- * Wavpack not found (using bundled version) 20:14 < bridge> -- * Zlib not found (using bundled version) 20:14 < bridge> -- * Vulkan not found (using bundled version) 20:14 < bridge> -- Configuring done (0.2s) 20:14 < bridge> CMake Error in CMakeLists.txt: 20:14 < bridge> IMPORTED_IMPLIB not set for imported target "GTest::gtest" configuration 20:14 < bridge> "Release". 20:16 < bridge> https://github.com/ddnet/ddnet/issues/4457 20:24 < bridge> I tried the new command, but here's another error. 20:24 < bridge> 20:24 < bridge> ``` 20:24 < bridge> ====================[ Build | package_zip | Release-MinGW ]===================== 20:24 < bridge> /home/filoqcus/Desktop/JetBrains/Toolbox/apps/clion/bin/cmake/linux/x64/bin/cmake --build /home/filoqcus/CLionProjects/ddnet/cmake-build-release-mingw --target package_zip -j 10 20:24 < bridge> [99/323] Generating x86_64-pc-windows-gnu/release/libddnet_engine_shared.a 20:24 < bridge> Compiling cc v1.0.73 20:24 < bridge> Compiling proc-macro2 v1.0.40 20:24 < bridge> Compiling unicode-ident v1.0.1 20:24 < bridge> Compiling quote v1.0.20 20:24 < bridge> Compiling cxxbridge-flags v1.0.71 20:24 < bridge> Compiling syn v1.0.98 20:24 < bridge> Compiling ddnet-test v0.0.1 (/home/filoqcus/CLionProjects/ddnet/src/rust-bridge/test) 20:24 < bridge> Compiling ddnet-engine-shared v0.0.1 (/home/filoqcus/CLionProjects/ddnet/src/engine/shared) 20:24 < bridge> error[E0463]: can't find crate for `std` 20:24 < bridge> | 20:24 < bridge> = note: the `x86_64-pc-windows-gnu` target may not be installed 20:24 < bridge> = help: consider downloading the target with `rustup target add x86_64-pc-windows-gnu` 20:24 < bridge> 20:24 < bridge> For more information about this error, try `rustc --explain E0463`. 20:24 < bridge> error: could not compile `ddnet-test` (lib) due to 1 previous error 20:24 < bridge> warning: build failed, waiting for other jobs to finish... 20:24 < bridge> [106/323] Building CXX object CMakeFiles/map_diff.dir/src/tools/map_diff.cpp.obj 20:24 < bridge> FAILED: x86_64-pc-windows-gnu/release/libddnet_engine_shared.a /home/filoqcus/CLionProjects/ddnet/cmake-build-release-mingw/x86_64-pc-windows-gnu/release/libddnet_engine_shared.a 20:24 < bridge> cd /home/filoqcus/CLionProjects/ddnet/cmake-build-release-mingw && /home/filoqcus/Desktop/JetBrains/Toolbox/apps/clion/bin/cmake/linux/x64/bin/cmake -E env CARGO_TARGET_DIR=/home/filoqcus/CLionProjects/ddnet/cmake-build-release-mingw DDNET_TEST_NO_LINK=1 /usr/bin/cargo build --manifest-path /home/filoqcus/CLionProjects/ddnet/Cargo.toml --target x86_64-pc-windows-gnu --release 20:25 < bridge> [116/323] Building CXX object CMakeFiles/engine-shared.dir/src/base/system.cpp.obj 20:25 < bridge> ninja: build stopped: subcommand failed. 20:25 < bridge> ``` 20:25 < bridge> This one is easy to fix, just install the toolchain as cargo suggested with: 20:25 < bridge> `rustup target add x86_64-pc-windows-gnu` 20:42 < bridge> ``` 20:42 < bridge> ====================[ Build | package_zip | Release-MinGW ]===================== 20:42 < bridge> /home/filoqcus/Desktop/JetBrains/Toolbox/apps/clion/bin/cmake/linux/x64/bin/cmake --build /home/filoqcus/CLionProjects/ddnet/cmake-build-release-mingw --target package_zip -j 10 20:42 < bridge> [0/199] Generating x86_64-pc-windows-gnu/release/libddnet_engine_shared.a 20:42 < bridge> no such file or directory 20:42 < bridge> FAILED: x86_64-pc-windows-gnu/release/libddnet_engine_shared.a /home/filoqcus/CLionProjects/ddnet/cmake-build-release-mingw/x86_64-pc-windows-gnu/release/libddnet_engine_shared.a 20:42 < bridge> cd /home/filoqcus/CLionProjects/ddnet/cmake-build-release-mingw && /home/filoqcus/Desktop/JetBrains/Toolbox/apps/clion/bin/cmake/linux/x64/bin/cmake -E env CARGO_TARGET_DIR=/home/filoqcus/CLionProjects/ddnet/cmake-build-release-mingw DDNET_TEST_NO_LINK=1 /usr/bin/cargo build --manifest-path /home/filoqcus/CLionProjects/ddnet/Cargo.toml --target x86_64-pc-windows-gnu --release 20:42 < bridge> ninja: build stopped: subcommand failed. 20:42 < bridge> ``` 20:42 < bridge> 20:42 < bridge> :< 20:45 < bridge> this looks like the output you get when you generated it before 20:45 < bridge> `rustup default stable-x86_64-pc-windows-gnu 20:45 < bridge> `rustup default stable-x86_64-pc-windows-gnu` 20:46 < bridge> ```txt 20:46 < bridge> ❯ rustup default stable-x86_64-pc-windows-gnu 20:46 < bridge> error: toolchain 'stable-x86_64-pc-windows-gnu' may not be able to run on this system 20:46 < bridge> note: to build software for that platform, try `rustup target add x86_64-pc-windows-gnu` instead 20:46 < bridge> note: add the `--force-non-host` flag to install the toolchain anyway 20:46 < bridge> ``` 20:46 < bridge> whadahell 20:46 < bridge> its telling you not to use gnu, but instead use gnu 20:47 < bridge> run the command in your msys2 shell (ucrt64, i assume) 20:47 < bridge> It's built! 20:47 < bridge> One second 20:48 < bridge> `-DCMAKE_DISABLE_FIND_PACKAGE_GTest=ON -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/mingw64.toolchain` 20:48 < bridge> @blaiszephyr These are the arguments we need to build on linux. 20:48 < bridge> :> 20:48 < bridge> https://github.com/ddnet/ddnet/issues/7660 20:48 < bridge> 20:48 < bridge> is this issue still relevant? what generated error[E0463]: can't find crate for `std` 20:49 < bridge> | 20:49 < bridge> = note: the `x86_64-pc-windows-gnu` target may not be installed 20:49 < bridge> = help: consider downloading the target with `rustup target add x86_64-pc-windows-gnu`? 20:49 < bridge> 20:49 < bridge> if that was rust itself, this issue can be resolved 20:49 < bridge> oooh i forgot you're trying to cross-compile right? 20:49 < bridge> Yea... 20:49 < bridge> https://github.com/ddnet/ddnet/issues/7660 20:49 < bridge> 20:49 < bridge> is this issue still relevant? what generated 20:49 < bridge> ``` 20:49 < bridge> error[E0463]: can't find crate for `std` 20:49 < bridge> | 20:49 < bridge> = note: the `x86_64-pc-windows-gnu` target may not be installed 20:49 < bridge> = help: consider downloading the target with `rustup target add x86_64-pc-windows-gnu`? 20:49 < bridge> ``` 20:49 < bridge> if that was rust itself, this issue can be resolved 20:49 < bridge> https://github.com/ddnet/ddnet/issues/7660 20:49 < bridge> 20:49 < bridge> is this issue still relevant? what generated 20:49 < bridge> ``` 20:49 < bridge> error[E0463]: can't find crate for `std` 20:49 < bridge> | 20:49 < bridge> = note: the `x86_64-pc-windows-gnu` target may not be installed 20:50 < bridge> = help: consider downloading the target with `rustup target add x86_64-pc-windows-gnu`? 20:50 < bridge> ``` 20:50 < bridge> if that was rust itself, this issue can be partly resolved, or does it not throw an error when you use the wrong one? (e.g msvc) 20:52 < bridge> > ../src/game/client/components/maplayers.cpp:1174:22: error: unused variable ‘IsEntityLayer’ [-Werror=unused-variable] 20:52 < bridge> > 1174 | bool IsEntityLayer = LayerType != -1; 20:52 < bridge> Lol immediately factored out xD 20:57 < bridge> . 21:22 < bridge> @ryozuki I'm 10x developer, I added 2 instructions in 1 day 21:22 < bridge> xd 21:24 < bridge> yeah, still relevant, the error message on Windows is useless `cannot find debug/libddnet_engine_shared.a` 21:24 < bridge> fair - annoying 21:24 < bridge> 21:24 < bridge> i remember trying to somehow detect that but with no real luck 22:41 < bridge> @ryozuki compiled using tja 🥹 22:41 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1357455037349232690/image.png?ex=67f04405&is=67eef285&hm=49a1a263620bd30459a3f08dafd6bf1bdb96aed1c49e2b4b995f21a37a555636& 22:44 < bridge> nice 22:46 < bridge> xd 23:55 < bridge> <_qey> Oh, the Discord almighty, I call for your help once more. 23:55 < bridge> did you try turniung it on and off again 23:55 < bridge> <_qey> How the fuck am I supposed to change Time for Score server-side? 23:56 < bridge> We might be almighty, but not omnicient, do you have any context for us? 23:56 < bridge> <_qey> I need to keep perks of DDRace, but I don’t need time and timer logic. In the scoreboard it says Time, I need to say it Score and not render as 0:00 at 0. 23:57 < bridge> hmm, I don't know if you can change what the scoreboard says, but there are maps using time as a score, take a look at that FlappyBird map for example 23:57 < bridge> SERVER_FLAG_TIMESCORE 23:58 < bridge> is this mapping or modding related? 23:58 < bridge> he said server side hmm 23:59 < bridge> <_qey> Do I just remove it from engine/server/server.cpp? 23:59 < bridge> <_qey> Second one.