00:00 < bridge> Idk if there is any value in that unless the n is large enough that logn is slow though 00:01 < bridge> This can easily become O(1) too 00:01 < bridge> Remember, constant factors matter too! 00:04 < bridge> @essigautomat could you benchmark now? 00:04 < bridge> its now with stl 00:04 < bridge> i wonder if it changed anything 00:04 < bridge> I am drunk but yes 00:07 < bridge> @kebscs my compiler sends a lot of warnings D: 00:09 < bridge> in my code? 00:09 < bridge> i dont get any 00:10 < bridge> let me compile in release 00:10 < bridge> `The key you just pressed is not recognized by SDL. To help get this fixed, please report this to the SDL forums/mailing list X11 KeyCode 248 (240), X11 KeySym 0x0 ((null)).` 00:10 < bridge> might be another change on master? 00:10 < bridge> also something in render.h 00:11 < bridge> no merged prs since then 00:11 < bridge> also none 00:13 < bridge> ``` 00:13 < bridge> ddnet/src/game/editor/mapitems/envelope.h:45:17: warning: type qualifiers ignored on function return type [-Wignored-qualifiers] 00:13 < bridge> [build] 45 | const int FindPointIndex(double TimeMillis) const override; 00:13 < bridge> ``` 00:14 < bridge> yea i see on github now 00:15 < bridge> pushed fix 00:18 < bridge> I see similar results 00:19 < bridge> ```markdown 00:19 < bridge> | | #frames old | FT old avg. (µs) | FT old min (µs) | FT old max (µs) | #frames new | FT new avg. (µs) | FT new min (µs) | FT new max (µs) | Improvement avg. (%) | Improvement min (%) | Improvement max (%) | 00:19 < bridge> |:----------|--------------:|-------------------:|------------------:|------------------:|--------------:|-------------------:|------------------:|------------------:|-----------------------:|----------------------:|----------------------:| 00:19 < bridge> | dm1 | 36795 | 1630.25 | 115 | 16737 | 39313 | 1525.79 | 164 | 10601 | 6.40751 | -42.6087 | 36.6613 | 00:19 < bridge> | kingsleap | 17718 | 3386.21 | 2548 | 13209 | 22381 | 2680.66 | 1972 | 9955 | 20.836 | 22.606 | 24.6347 | 00:19 < bridge> ``` 00:19 < bridge> 6-7 % on dm1, 22-23% on kings leap improvement 00:19 < bridge> Only question is 00:19 < bridge> Why do I have still 2.5x the FPS on ddnet-rs 00:20 < bridge> Most of the rendering pipeline should be equal to ddnet 00:20 < bridge> I can just throw bad guessed at you 🤷‍♂️ 00:21 < bridge> I'd maybe fire up a profiler on that map part 00:21 < bridge> 1524 vs 1525 avg alright the stl its literally the same 00:21 < bridge> 1524 vs 1525 avg alright the stl is literally the same 00:22 < bridge> on dm1 its 2616 vs 2680 new 00:24 < bridge> stl is 0.1/ 0.08 worse 00:24 < bridge> stl is 0.1/ 0.08% worse 00:39 < bridge> I could have told you this before you spent your time on it 00:40 < bridge> yea i knew this, i did it bcs of this 00:40 < bridge> it isnt much cleaner though, when i had to add new funcs, but whatever 00:41 < bridge> rip 00:41 < bridge> it could have specific optimizations for other platforms/CPUs 00:41 < bridge> i wouldn't discredit it entirely 00:42 < bridge> i also dont know what the func even is i've been skimming the shit out of this 00:43 < bridge> i cant see if anyone has addressed this 00:43 < bridge> cpp reference says its literally binary search 00:43 < bridge> ever hear about static initialization order? 00:43 < bridge> good fucking luck 00:44 < bridge> i fixed it already 00:44 < bridge> nice 00:44 < bridge> what was it 00:44 < bridge> stack overflow 00:45 < bridge> i had 17mb stack array somewhere on accident 00:45 < bridge> xd 00:45 < bridge> that's a no no 00:45 < bridge> so the main function didn't have enough space xd 01:07 < ws-client> @kebscs yea but ur pr is only for death right? 01:08 < ws-client> i am a gnomie and i tab into ddnet by clicking on the window :D which also gets picked up as click in game 01:09 < bridge> yes, but if my pr doesnt get merged i dont want do another pr with almost same thing 01:09 < ws-client> fair 01:09 < ws-client> yea we need to get rid of the 100 open prs 01:16 < bridge> @robyt3 would you consider adding some logic to the touch controls to a). optionally have no action on tap and b). optionally not show the touch controls 01:16 < bridge> use case: touch screen tablet where you only want to aim with the touch screen because it's absolute positioning 01:17 < bridge> if you bind mouse buttons to smth accessible on the keyboard that could go crazy 01:23 < bridge> wait this is all configurable by json already, you've really got this shit on lockdown 01:23 < bridge> disregard 😅 01:25 < bridge> I think just reading a config file and having no menu for configuration is quite based, but mobile is the last place you'd want that 01:26 < bridge> seems like a pain to make a good configuration interface for mobile, though 01:26 < bridge> so many options to change, precise placements to make 08:55 < bridge> # 09:24 < bridge> @jupeyy_keks I made it work 09:24 < bridge> ```rust 09:24 < bridge> fn find_mut<'a, T, O>(&'a mut self, f: T) -> Option 09:24 < bridge> where 09:24 < bridge> T: Fn(&'a mut Scope<'ir>) -> Option, 09:24 < bridge> { 09:24 < bridge> let index_map: HashMap<_, _> = self.stack.iter().cloned().enumerate().collect(); 09:24 < bridge> let mut scopes: Vec<(usize, &mut Scope)> = self 09:24 < bridge> .scopes 09:24 < bridge> .iter_mut() 09:24 < bridge> .enumerate() 09:24 < bridge> .filter_map(|(idx, scope)| { 09:24 < bridge> if self.stack.contains(&idx) { 09:24 < bridge> Some((idx, scope)) 09:24 < bridge> } else { 09:24 < bridge> None 09:24 < bridge> } 09:24 < bridge> }) 09:24 < bridge> .collect(); 09:25 < bridge> scopes.sort_by_key(|(idx, _)| index_map[idx]); 09:25 < bridge> 09:25 < bridge> scopes.into_iter().rev().find_map(|(_, scope)| f(scope)) 09:25 < bridge> } 09:25 < bridge> ``` 09:25 < bridge> I'm not sure yet if `sort_by_key` part works but the idea itself works 09:27 < bridge> 😮 nice 09:27 < bridge> Looks like completely different logic now 09:28 < bridge> it collects scopes with indices from `stack` 09:32 < bridge> ```rust 09:32 < bridge> self.scopes 09:32 < bridge> .iter_mut() 09:32 < bridge> .rev() 09:32 < bridge> .enumerate() 09:32 < bridge> .filter_map(|(idx, scope)| { 09:32 < bridge> if self.stack.contains(&idx) { 09:32 < bridge> Some(scope) 09:32 < bridge> } else { 09:32 < bridge> None 09:32 < bridge> } 09:32 < bridge> }) 09:32 < bridge> .find_map(f) 09:32 < bridge> ``` 09:32 < bridge> I think this is enough 09:35 < bridge> Ah yeah then it's tied to lifetime of scopes 10:23 < bridge> If only you were using a sane language like C you wouldn't have to waste your time trying to prove to the compiler what is obvious to you 10:23 < bridge> true 10:25 < bridge> my language won't have all this fancy shmancy stuff, you will be allowed to shoot yourself in the foot as many times as you want 10:26 < bridge> ✨ Writing the unsafest language in Rust 10:28 < bridge> I will use your language for everything. I love footguns 10:28 < bridge> combined with bugs in compiler code it's going to be great :lol: 10:29 < bridge> i should write tests :feelsbadman: 10:29 < bridge> Writing tests is a sign of self doubt. You should be confident in your abilities 10:30 < bridge> Just don't write bugs 10:30 < bridge> Simple as that 10:30 < bridge> 3 months ago I changed a few lines in parser and today I found out it causes stack overflow xd 10:31 < bridge> noted 10:31 < bridge> Finally Jupstar is coming over to the light side 11:14 < bridge> guys check out my jquery clone 11:14 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1362717986577842357/image.png?ex=68036986&is=68021806&hm=0b98dfc7a23446c4d25b98c78d56ea956a9b21d552c4ea51da2066a15292b94b& 11:30 < bridge> That looks too advanced for me 11:36 < bridge> but it's wrong 11:39 < bridge> thats basically what jquery does idk what ur talking abt 11:39 < bridge> its wrong 11:39 < bridge> (you seem to not understand that this is a /j...) 11:40 < bridge> but its wrong 11:40 < bridge> [facepalm~4](https://cdn.discordapp.com/emojis/885545277472276481.gif?size=48&animated=true&name=facepalm%7E4) 11:40 < bridge> good for you you 11:40 < bridge> good for you 11:40 < bridge> you can say wrong things! i will crash out! 11:40 < bridge> you cant say wrong things! i will crash out! 11:41 < bridge> hi 11:41 < bridge> I need ddnet ipa file 11:42 < bridge> its correct. I'm the inventor of jquery, John Query, this is how I wrote it 11:42 < bridge> thank you :) 11:42 < bridge> We do not have an iOS build, only Android, sorry boss 11:42 < bridge> sdl ios exists... 11:42 < bridge> ben 4 gundur bunun icin ugrasıyorum fakat bir sonuc bulamafım 11:42 < bridge> but good luck getting something this foss onto the apple store 11:43 < bridge> bun bun mentioned 11:43 < bridge> It will work if there is a ddnet ipa file 11:43 < bridge> bun means zig to me 11:43 < bridge> but good luck getting something this foss onto the apple store 11:43 < bridge> (also just a pain to setup, and barely anyone uses android... or plays ddnet, would be cool though redardless) 11:43 < bridge> Cunku yok, iphone versiyonu yapmadik, sadece android var 11:43 < bridge> zig zig 11:44 < bridge> knk yapamazmısınız ya 11:45 < bridge> Belki ileride 11:45 < bridge> beklemedeyim 11:45 < bridge> Didn't the EU force apple to allow 3rd party appstores? Perhaps we can get a build in there 11:45 < bridge> yaptıgınız an bana haber edin 11:45 < bridge> i dont know how thats going 11:47 < bridge> https://altstore.io/ 11:47 < bridge> nice 11:47 < bridge> > The only major difference is that your apps will only be available in the EU. 11:47 < bridge> unnice 11:48 < bridge> what a piss take 11:48 < bridge> chillerdragon: did you find a fix for `mysql: can't free last result (free_result:stmt:5025): Statement has no result set` 11:48 < bridge> chillerdragon: did you find a fix for `mysql: can't free last result (free_result:stmt:5025): Statement has no result set` yet? 11:48 < bridge> chillerdragon: did you find a fix for `mysql: can't free last result (free_result:stmt:5025): Statement has no result set` yet? 11:48 < bridge> hi lemon backwards 11:48 < bridge> hi fake solly 11:48 < bridge> hi "lemon"[::-1] 11:48 < bridge> why am i fake 11:48 < bridge> hi fake souly 11:48 < bridge> youre the fake one 11:48 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1362726540546412605/image.png?ex=6803717d&is=68021ffd&hm=b9b62c670d8d17000c9528ad8858b846179a024f19210766dcb200c01e11a018& 11:48 < bridge> youre an app 11:48 < bridge> YAYYY 11:48 < bridge> no u!" 11:48 < bridge> no u! 11:48 < bridge> darn 11:48 < bridge> i dont have a counter to that 11:49 < bridge> back to crying 11:49 < bridge> 😅 11:49 < bridge> i use matrix to ping apps, just feels better to see 11:49 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1362726804309409832/image.png?ex=680371bc&is=6802203c&hm=caabbc3c72036807a586f8c0fe8853b5064b01e18c1e1f451de1a1304ac1cbbb& 11:50 < bridge> chillerdragon is an app = chillerdragon is a bot, confirmed 11:54 < ws-client> nah i am waiting for zwelf insight @melon 11:54 < ws-client> i have no idea 11:55 < bridge> Guys is this real? 11:55 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1362728219215794277/RDT_20250418_1254241920573333602001657.jpg?ex=6803730d&is=6802218d&hm=9a18c82fa001446bd92b53811f768f5954f5af98febc9b7af01ea7147979c3fb& 11:55 < bridge> (I have no idea what any of that code means, but it's scary and probably very efficient) 11:56 < ws-client> ``include `` 11:56 < ws-client> ``int main() { printf("hello world."); return 0; }`` 11:57 < bridge> iostream maybe? idk C 11:57 < bridge> cstd eingabe ausgabe 11:58 < ws-client> it should be stdio.h 11:58 < ws-client> EIN AUSGABE lel 11:58 < bridge> chiller doesn't get the joke 11:58 < ws-client> clearly 11:58 < bridge> chiller are you german? 11:58 < bridge> I -> E 11:58 < bridge> O -> A 11:58 < bridge> hm 11:58 < ws-client> cstd is C standard? 11:58 < bridge> A is Aus , I guess 11:58 < ws-client> yes 11:58 < bridge> well, food for thought cuz im not 11:59 < bridge> im scratching my head with English C++ :heh: 11:59 < ws-client> but you should recognize the shape of the program :D 11:59 < ws-client> @Jupstar ✪ but cstdio is C++ not C 12:00 < bridge> Funnily enough, I know hello world in java but not C/C++/C# 12:00 < bridge> E idk, eingang? 12:00 < ws-client> eingabe is what jupstar said 12:00 < ws-client> eingang is entrance and eingabe is input 12:00 < bridge> oic, I couldn't read his moon runes 12:01 < bridge> ```java 12:01 < bridge> public static void main(string args[]) { 12:01 < bridge> System.out.println("Say it 10 times fast."); 12:01 < bridge> } 12:01 < bridge> ``` 12:01 < bridge> _probably correct_ ^ 12:02 < bridge> not... 12:02 < bridge> sadge 12:02 < ws-client> ``öffentlich statisch nichts haupt(schnur argumente[]( { system.raus.druckZeile("Sag es 10 mal schnell!"); }`` 12:02 < bridge> isn't string capitalized 12:02 < bridge> sadge 12:02 < bridge> Nein 12:02 < bridge> public static final main 12:02 < bridge> It's `String[] args` 12:02 < bridge> Not `string args[]` 12:03 < bridge> because java hates me 12:03 < bridge> "you failed to compile a simple prgram, your memory will be corrupted in 5..4..3..2..1... 12:03 < bridge> "you failed to compile a simple prgram, your memory will be corrupted in 5..4..3..2..1..." 12:03 < bridge> "you failed to compile a simple program, your memory will be corrupted in 5..4..3..2..1..." 12:03 < ws-client> its not C++ 12:03 < bridge> scheisse... 12:03 < bridge> `public static final MainFuncFactoryEx createMainFuncFactory()` 12:03 < bridge> i'm sure you can corrupt memory if you try hard enough 12:03 < bridge> `public static final MainFuncFactoryEx createMainFuncFactoryEx()` 12:03 < ws-client> lol @learath2 12:08 < bridge> ``` 12:08 < bridge> purr std::meow; 12:08 < bridge> 12:08 < bridge> cat main (nya args[^ouo^]) { 12:08 < bridge> meow "nyaaas:"; 12:08 < bridge> fur nya arg in args { 12:08 < bridge> meow nya; 12:08 < bridge> } 12:08 < bridge> } 12:08 < bridge> oops 12:08 < bridge> ``` 12:08 < bridge> purr std::meow; 12:08 < bridge> 12:08 < bridge> cat main (nya args[^ouo^]) { 12:08 < bridge> meow "nyaaas:"; 12:08 < bridge> fur nya arg in args { 12:08 < bridge> meow nya; 12:08 < bridge> } 12:08 < bridge> }``` 12:48 < bridge> you use `git push --force` 12:48 < bridge> i use `git push --force-with-lease` (i dont know what that does) 12:48 < bridge> we are not the same 12:49 < bridge> ``` 12:49 < bridge> --force-with-lease is a safer option that will not overwrite any work on the remote branch if more commits were added to the remote branch (by another team-member or coworker or what have you). It ensures you do not overwrite someone elses work by force pushing. 12:49 < bridge> ``` 12:49 < bridge> oh... thats good to know 12:49 < bridge> til 13:00 < bridge> Chillerdragon its `standard eingang ausgang` aka stdio 13:01 < bridge> Also this is c++ and not C 13:01 < bridge> Also this isn't actually real because you can't rename macros in any way 13:02 < bridge> Also whomever made the meme does not use c 13:02 < bridge> Also whoever made the meme does not use c 13:03 < bridge> teero C gigachad 13:04 < bridge> they forgot the void inside the main func params, if you use pedantic warnings it will complain. No arguments are weird 13:08 < bridge> biased 👀 13:08 < bridge> aka based 13:49 < bridge> For bonus points tell us the difference in meaning of `(void)` and `()` 13:49 < bridge> i can do that!!! 13:51 < bridge> before c99, it was legal to not list the arguments of your function, 13:51 < bridge> void a() with an arg can be called as much as without a warning as void b(int) 13:51 < bridge> at that time the only way to say "there are no args" is to use (void) 13:51 < bridge> now its illegal to not put the arguments 13:51 < bridge> for backwards compatibility sake you can still case your function pointer to whichever you need and then call it 13:51 < bridge> and its only *technically* ub 13:52 < bridge> before c99, it was legal to not list the arguments of your function, 13:52 < bridge> void a() with an arg can be called as much as without a warning as void b(int) 13:52 < bridge> at that time the only way to say "there are no args" is to use (void) 13:52 < bridge> ~~now its illegal to not put the arguments~~ (only illegal in cpp) 13:52 < bridge> you can still case your function pointer to whichever you need and then call it to avoid the warning 13:52 < bridge> and its only *technically* ub 13:52 < bridge> before c99, it was legal to not list the arguments of your function, 13:52 < bridge> void a() with an arg can be called as much as without a warning as void b(int) 13:52 < bridge> at that time the only way to say "there are no args" is to use (void) 13:52 < bridge> ~~now its illegal to not put the arguments~~ (only illegal in cpp) 13:52 < bridge> you can still case your function pointer to whichever you need and then call it to avoid the warning 13:52 < bridge> ~~and its only *technically* ub~~ (In cpp) 13:55 < bridge> its to not list the arguments of your function, 13:55 < bridge> as calling conventions do not care about the type nor quantity, you can always access the nth argument the same 13:55 < bridge> void a() with an arg can be called as much as without a warning as void b(int) 13:55 < bridge> at that time the only way to say "there are no args" is to use (void) 13:55 < bridge> ~~now its illegal to not put the arguments~~ (only illegal in cpp) 13:55 < bridge> you can still case your function pointer to whichever you need and then call it to avoid the warning 13:55 < bridge> ~~and its only *technically* ub~~ (In cpp) 13:55 < bridge> its legal to not list the arguments of your function (and not do `...`) 13:55 < bridge> as calling conventions do not care about the type nor quantity, you can always access the nth argument the same 13:55 < bridge> void a() with an arg can be called as much as without a warning as void b(int) 13:55 < bridge> at that time the only way to say "there are no args" is to use (void) 13:55 < bridge> ~~now its illegal to not put the arguments~~ (only illegal in cpp) 13:55 < bridge> you can still case your function pointer to whichever you need and then call it to avoid the warning 13:55 < bridge> ~~and its only *technically* ub~~ (In cpp) 13:56 < bridge> its legal to not list the arguments of your function (and not do `...`) 13:56 < bridge> as calling conventions do not care about the type nor quantity, you can always access the nth argument the same 13:56 < bridge> void a() with an arg can be called as much as without a warning as void b(int) 13:56 < bridge> at that time the only way to say "there are no args" is to use (void) 13:56 < bridge> ~~now its illegal to not put the arguments~~ (only illegal in cpp) 13:56 < bridge> you can still cast your function pointer to whichever you need and then call it to avoid the warning 13:56 < bridge> ~~and its only *technically* ub~~ (In cpp) 13:56 < bridge> its legal to not list the arguments of your function (and not do `...`) in c 13:56 < bridge> as calling conventions do not care about the type nor quantity, you can always access the nth argument the same 13:56 < bridge> void a() with an arg can be called as much as without a warning as void b(int) 13:56 < bridge> at that time the only way to say "there are no args" is to use (void) 13:56 < bridge> ~~now its illegal to not put the arguments~~ (only illegal in cpp) 13:56 < bridge> you can still cast your function pointer to whichever you need and then call it to avoid the warning 13:56 < bridge> ~~and its only *technically* ub~~ (In cpp) 13:57 < bridge> in gcc you get a warning if you didnt previously declare the arguments unless -Wstrict-prototypes(-Wpedantic) is enabled 13:58 < bridge> so i think the only non warning way to do that is forward decleration 13:58 < bridge> ```cpp 13:58 < bridge> void myfunc(); 13:58 < bridge> 13:58 < bridge> ... 13:58 < bridge> myfunc(1, 2, 3) 13:58 < bridge> 13:58 < bridge> void myfunc(int a, int b, int c) { ... } 13:58 < bridge> ``` 14:02 < bridge> both () and (void) are legal in cpp 14:03 < bridge> both () and (void) are legal and mean the same thing in cpp 14:04 < bridge> its illegal (only technically ub) to call functions with "wrong" arguments 14:04 < bridge> its legal to not list the arguments of your function (and not do `...`) in c 14:04 < bridge> as calling conventions do not care about the type nor quantity, you can always access the nth argument the same 14:04 < bridge> void a() with an arg can be called as much as without a warning as void b(int) 14:04 < bridge> at that time the only way to say "there are no args" is to use (void) 14:04 < bridge> you can still cast your function pointer to whichever you need and then call it to avoid the warning 14:04 < bridge> its illegal (only technically ub) to call functions with "wrong" arguments in cpp 14:05 < bridge> (the same amount of ub as the compiler compiling a nullptr dereference to code which uses a zero day to zero your drive, that is it wont do anything weird) 14:09 < bridge> It's actually much more complicated, but yeah that's the gist of it 14:09 < bridge> Pro souly 14:10 < bridge> There was a huge discussion about this a couple years back on ##c, it took many hours and many language pedants to figure out what is actually going on 14:10 < bridge> i think "the gist of it" is pretty good for a language with decades of emotional baggage 14:23 < bridge> The issue is that `void foo() {}` does not provide a function prototype because of how 6.9.1p7 is worded. It does actually define a function that takes no arguments just fine 😄 14:25 < bridge> idk what that means 14:26 < bridge> `void foo() {}` is not a function that can take any amount of arguments. It's a function that definitively takes no arguments 14:26 < bridge> `void foo();` however declares a function `foo` that can take any amount of arguments of any type 14:28 < bridge> oke 14:34 < bridge> holdon ima check that 14:35 < bridge> Honestly, completely pointless pedantic stuff. Just don't use `()` ever 14:35 < bridge> just use cpp :D 14:37 < bridge> All the way from C89 there is always a section 6.11.6 saying the empty parens is obsolete 14:38 < bridge> you can only get the first arg with inline asm 14:39 < bridge> The only reason C allows you to call it with any amount of arguments is that it's the sole case of a function definition that does not provide a function prototype 14:40 < bridge> if you give the implmentation ({}) then the compiler knows (unless asm) that it takes no args 14:40 < bridge> but unless its static or decides to use a different calling convention then its fine 14:41 < bridge> but unless its static (gets inlined) or decides to use a different calling convention then u can asm 14:41 < bridge> It knows, but until C23 it is still not an error to call it with any amount of arguments, even though it does define a function that has 0 arguments properly. Calling it with any argument at all is undefined behaviour, BUT it is technically not an error 😄 14:42 < bridge> really 14:42 < bridge> the stack is cleaned up by the caller so its fine 14:42 < bridge> You can try, the following snippet will compile just fine until c23 14:42 < bridge> ```c 14:42 < bridge> void foo() {} 14:42 < bridge> int main(void) { 14:42 < bridge> foo(10); 14:42 < bridge> } 14:42 < bridge> ``` 14:42 < bridge> damn 14:43 < bridge> It does invoke UB, but it will compile 14:43 < bridge> Depends on the calling convention, but I'd assume every implementation probably just calls it properly in a way you can get the args 14:44 < bridge> i am unaware of a calling convention where the caller has to do it 14:44 < bridge> i am unaware of a calling convention where the callee has to do it 14:45 < bridge> You do need to know the type of the argument passed though, as iirc it won't call it with the arguments on stack, it'll put them in the correct places as per their types 14:45 < bridge> well thats a given 14:45 < bridge> no reflection 14:45 < bridge> unless you wrap all your things in shiny (reflective) structs 14:46 < bridge> unless you wrap all your things in tinfoil (reflective structs) 14:46 < bridge> (stdcall btw) 14:46 < bridge> `The stdcall[5] calling convention is a variation on the Pascal calling convention in which the callee is responsible for cleaning up the stack` 14:46 < bridge> how could it! 14:46 < bridge> i was going thu the list myself 14:46 < bridge> It's also used for every winapi function to this date 14:47 < bridge> why 14:47 < bridge> Unless you are careful even those can end up in registers, you need fat reflective structs 😄 14:47 < bridge> Only god and mr bill gates knows why 14:47 < bridge> with a known calling convention you can always just slap it into a buffer then do your processing 14:48 < bridge> a reflective struct is already fat 14:48 < bridge> struct { int id; char data[] } 14:48 < bridge> min size of 5 bytes but padding makes it 8 14:50 < bridge> we have so many registers why arent we passing stuff on them 14:50 < bridge> Observe the case of `struct {int x, y;}` it is less than 4 eightbytes, thus it can end up passed in registers as per amd64 sysv abi 14:50 < bridge> 4 +4 = 8? 14:50 < bridge> Assume `sizeof(int) == 8` 14:50 < bridge> 8 + 8 = 16? 14:51 < bridge> That's only 2 eightbytes total, can be passed in registers 14:51 < bridge> . 14:51 < bridge> Anything larger than 4 eitghtbytes goes to the stack instantly 14:51 < bridge> 4 "eightbytes" 14:51 < bridge> 32 bytes? 14:52 < bridge> It's the language the calling convention uses, I do not remember the reason 14:52 < bridge> Perhaps because an eightbyte is the size of a register in amd64 14:52 < bridge> you have masses of space in registers 14:52 < bridge> why arent we using it 14:53 < bridge> well i guess anything which would benefit from fast calling would be static 14:53 < bridge> do compilers do that tho 14:53 < bridge> Well we are trying to use it, but not very very aggressively 14:53 < bridge> make up calling conventions for static functions 14:56 < bridge> Oh actually just checked it, I misremembered, it's 2 eightbytes, not 4 😄 14:56 < bridge> Idk why we don't use more of the registerspace more aggressively 14:57 < bridge> lmao 14:57 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1362773945241043205/image.png?ex=68039da3&is=68024c23&hm=9504f53b28a07f38debe049a5810c4f98a21a4622ae466739ae06d9fd8f648a9& 14:57 < bridge> i told gcc to not inline it 14:57 < bridge> so it doesnt but it optimizing the function to just set it to 10 xd 14:58 < bridge> Try just -O0 I guess 14:58 < bridge> then it probbaly wont make up a calling convention 14:58 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1362774280303149187/image.png?ex=68039df3&is=68024c73&hm=a7ca05ec0c1480dba8e7e1e5d38e90d6181b767f945b6f5ae26fd8835ca8d879& 14:58 < bridge> it does make up a calling convention fyi 14:58 < bridge> fastcall only allows 2 registers 14:58 < bridge> Hm, true, idk how we can force it to 😛 14:59 < bridge> I would guess it never comes up with it's own tbh 15:00 < bridge> Do you have a source for that claim? 15:00 < bridge> AT&T syntax 😬 15:00 < bridge> Idk anyone who prefers att syntax ngl 15:00 < bridge> No idea why it's still the default in so many places 😄 15:02 < bridge> ``` 15:02 < bridge> Microsoft fastcall 15:02 < bridge> Microsoft __fastcall convention (aka __msfastcall[citation needed]) passes the first two arguments (evaluated left to right) that fit, into ECX and EDX.[6] Remaining arguments are pushed onto the stack from right to left. When the compiler compiles for IA64 or AMD64, it ignores the __fastcall keyword (or any other calling convention keyword aside from __vectorcall) and uses the Microsoft default 64-bit calling convention instead. 15:02 < bridge> ```` 15:02 < bridge> it unrolled my loop 15:02 < bridge> as i wanted it to 15:02 < bridge> but didnt stick everything into registers 15:03 < bridge> This doesn't really say compilers come up with their own static calling convention 15:03 < bridge> ```cpp 15:03 < bridge> #include 15:03 < bridge> 15:03 < bridge> using Data = std::array; 15:03 < bridge> 15:03 < bridge> __attribute__ ((noinline)) static void func(Data data) { 15:03 < bridge> volatile int out = 0; 15:03 < bridge> for (int n : data) { 15:03 < bridge> out += n; 15:03 < bridge> } 15:03 < bridge> } 15:03 < bridge> 15:03 < bridge> int main(void) { 15:03 < bridge> Data data; 15:03 < bridge> data.fill(0); 15:03 < bridge> func(data); 15:03 < bridge> data.fill(1); 15:03 < bridge> func(data); 15:03 < bridge> } 15:03 < bridge> ``` 15:04 < bridge> no, which means that the compiler isnt doing fastcall 15:04 < bridge> and its not using wide registers for vectorcall 15:04 < bridge> It might be just getting ignored I guess 15:04 < bridge> it did use general purpose 8 and 9 15:04 < bridge> for whatever reason 15:04 < bridge> instead of... ya know 1 and 2 15:04 < bridge> (or 0 and 1) 15:04 < bridge> The as-if rule allows all un-observable changes to optimize. Any static function is unobservable 15:05 < bridge> yes 15:05 < bridge> and the no inline prevents it from just contexpr the whole thing 15:06 < bridge> clang also unrolls but goes thru the stack.... quicker? 15:06 < bridge> 1 less instruction idk if its faster 15:07 < bridge> clang 15:07 < bridge> ``` 15:07 < bridge> movl 16(%rsp), %eax 15:07 < bridge> addl %eax, -4(%rsp) 15:07 < bridge> movl 20(%rsp), %eax 15:07 < bridge> addl %eax, -4(%rsp) 15:07 < bridge> movl 24(%rsp), %eax 15:07 < bridge> addl %eax, -4(%rsp) 15:07 < bridge> movl 28(%rsp), %eax 15:07 < bridge> ``` 15:07 < bridge> gcc 15:07 < bridge> 15:07 < bridge> ``` 15:07 < bridge> addl 24(%rsp), %eax 15:07 < bridge> movl %eax, -4(%rsp) 15:07 < bridge> movl -4(%rsp), %eax 15:07 < bridge> addl 28(%rsp), %eax 15:07 < bridge> movl %eax, -4(%rsp) 15:08 < bridge> movl -4(%rsp), %eax 15:08 < bridge> addl 32(%rsp), %eax 15:08 < bridge> movl %eax, -4(%rsp) 15:08 < bridge> movl -4(%rsp), %eax 15:08 < bridge> addl 36(%rsp), %eax 15:08 < bridge> movl %eax, -4(%rsp) 15:08 < bridge> ``` 15:08 < bridge> its the same instructions so clang probably just big brained gcc 15:08 < bridge> its a shame though its only 40 bytes 15:08 < bridge> fits into 1 64 byte register ): 15:08 < bridge> i guess reading a register like that is slow 15:10 < bridge> well thats enuf of that 16:11 < bridge> I find that part about the ticket system where you don't get no notification at all, just getting either kicked out of the channel or the channel being deleted weird. how about writing a notification in the #✉-create-a-ticket that ticket has been resolved, denied, resolved with a reason text, etc :? 16:23 < bridge> You should get a DM from the DDNet bot with the transcript of the ticket which should also include the conclusion. 16:24 < bridge> not happened 16:24 < bridge> it sends a dm 16:24 < bridge> 👀 16:24 < bridge> atleast for me it did 16:24 < bridge> I justed tested it and it works for me 16:24 < bridge> I just tested it and it works for me 16:24 < bridge> what am I doing wrong? 16:24 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1362796004306325744/image.png?ex=6803b22e&is=680260ae&hm=c312cb880918df13b55f9c152d2f2949e78185a708b1b06e86b71f49d61257a4& 16:24 < bridge> did you disable dms? 16:25 < bridge> yes 16:25 < bridge> dms disabled ._. 16:26 < bridge> double edged sword 16:26 < bridge> those dms 16:26 < bridge> Well, that could explain not being able to receive DMs. Can we detect that with Discord API though 16:26 < bridge> can you see the bot's logs? 16:26 < bridge> maybe it printed something about that? 16:27 < bridge> https://stackoverflow.com/questions/70660854/how-to-check-if-a-bot-can-dm-a-user 16:28 < bridge> Wait I thought the ticket stays forever 16:28 < bridge> 15k ticket channels 16:28 < bridge> imagine 16:28 < bridge> 😄 16:28 < bridge> pribably logged somewhere 16:28 < bridge> probably logged somewhere 16:29 < bridge> *afk* 16:30 < bridge> # afk 16:30 < bridge> I guess it's like github issues, some stay open ... until resolved 16:31 < bridge> @murpi Maybe the Discord bot could check if DMs are possible and otherwise warn when creating a ticket that you won't get the transcripts if you don't allow DMs 16:32 < bridge> How do I warn a user who doesn't allow DMs? 😄 16:32 < bridge> inside the Channel, then delete after X days 16:32 < bridge> Show an extra block with a message when they open the ticket 16:34 < bridge> I guess I can include a warning when people create a ticket 16:52 < bridge> Array indices start at 0 in C, but start at 32 in F. 16:52 < bridge> ill see myself out 16:53 < bridge> in pascal arrays start with 0 and strings with 1 16:53 < bridge> just for max confusion 17:30 < bridge> you can i believe 17:30 < bridge> just use a try catch 17:37 < bridge> why are lasers so jittery when they move? why arent they like pickups that follow the players smoothly 17:45 < bridge> An in VBA you can define whether you want array indices to start at 0 or 1 in your module :santatrollet: 17:45 < bridge> And in VBA you can define whether you want array indices to start at 0 or 1 in your module :santatrollet: 17:53 < bridge> Better loading times with next nightly :deen_star: 18:07 < bridge> :nouis: 18:11 < bridge> gekühlterdrache: you here? 18:18 < bridge> :Aware: 18:19 < bridge> that is awesome :owo: 18:23 < bridge> does it change anything other than being able to have entire db downloaded without lag and high memory use? 18:23 < bridge> because. We could fix this, I did this for doors already 18:24 < bridge> it prevents @ admin @ moderator guys my game crashes because of error from deen 18:24 < bridge> It improves loading times and the memory usage is a huge problem 18:24 < bridge> i mean when they move around. not the prediction part 18:25 < bridge> xd 18:25 < bridge> deen sends errors 18:25 < bridge> :kek: 18:26 < bridge> yes and I am talking about the rendering. You mean why freezelasers stutter when rotating for example? 18:27 < bridge> It also moves most skin loading for downloaded skins to background jobs, so this should reduce the FPS impact when the downloaded skins are finished 18:28 < bridge> like for example on F-DDRace the StaffI Indicator has a laser part going around a shield, when the character starts moving the laser jitters behind but the shield stays smooth 18:28 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1362827213631787139/image.png?ex=6803cf3f&is=68027dbf&hm=6bd76a90a880ad52838351a0dd9dff6810c9f1d73bf9ab07706860aca8e3e7ee& 18:31 < bridge> Idk what F-DDRace does there 🤷🏻‍♂️ 18:32 < bridge> What even is a Staffl 18:32 < bridge> remove the l whoops 18:32 < bridge> staff indicator :(, blockworlds has that too 18:32 < bridge> is your guys also jittery when moving? 18:32 < bridge> .. only the laser .. 18:32 < bridge> why is that 18:32 < bridge> missing prediction probably 18:33 < bridge> blockworlds is based on teeworlds, not ddnet tho :p 18:36 < bridge> is there a way of fixing it serverside or is this just clientside 18:37 < bridge> Record a video 18:37 < bridge> Rendering is client side idk how anything would be jittery when position sent is probably the same 18:38 < bridge> just checked again, i dont think its broken prediction 18:38 < bridge> if you look at it closely it has a similar look to moving a picture on a low framerate 18:38 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1362829712220754103/jitteri.mp4?ex=6803d193&is=68028013&hm=f3f6f629a89aa22fb87bb2c13af230e7993bfbf194455ce4d4f5093fb8fe795c& 18:39 < bridge> thats smooth 18:39 < bridge> so its probably a f-ddrace issue :kek: 18:41 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1362830288308146388/Test.mp4?ex=6803d21c&is=6802809c&hm=c9a42aa5da75a424331df1cafa7369318bf00f59f0a89e8fd8ed89894079f5e1& 18:41 < bridge> this is what i see 18:41 < bridge> 💀 18:41 < bridge> yup 18:42 < bridge> odd though 18:46 < bridge> your custom particles are shit for this 18:47 < bridge> laser heads are randomly rotated and having 'hollow' ones doesn't help either 18:48 < bridge> the 'clock' also doesn't look good 18:48 < bridge> its F-DDRaces 18:48 < bridge> i didnt make any of this 18:49 < bridge> F-DDRace is still DDRace 18:49 < bridge> theres no f in ddrace 🤯 18:50 < bridge> why does the render cut to video thing crash when tabbing out 18:50 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1362832681431334912/Test.mp4?ex=6803d457&is=680282d7&hm=5677053918204160ae91fcec000d3edbd412e54d00069b258e581a214bf32540& 18:50 < bridge> anyways default particles 18:50 < bridge> did not make anything better 18:50 < bridge> it records your screen 18:51 < bridge> it looks way better 😮 18:52 < bridge> compare it to this and it looks shit 18:52 < bridge> rest is prediction and laser postion not beeing interpolated 18:52 < bridge> teeworlds > ddnet :dTeuPeposhrug: 18:56 < bridge> can you do it again on bw? 18:58 < bridge> can you send an ephemeral message to the user in #✉-create-a-ticket in case the dm fails 18:58 < bridge> @murpi 18:59 < bridge> murp said he wants to add a warning to it before 18:59 < bridge> would be great to have an actual message :/ 19:01 < bridge> whats the issue? 19:01 < bridge> the jitteryness of the laser 19:01 < bridge> its just a basic clock i made many years ago 19:01 < bridge> no thats not my issue thats Assa's issue 19:01 < bridge> For me it looks normal, do you have antiping ON? 19:02 < bridge> no 19:02 < bridge> weird. might be related to prediction bug thats happening on f-ddrace since a few ddnet client versions, dunno tho 19:03 < bridge> I'm not that into client dev and would appreciate help too regarding that 19:03 < bridge> I can look into staffind code later again, but i dont know/think it has a specific issue 19:04 < bridge> i think its in general anything with lasers 19:04 < bridge> they just jitter around if they move along with a player 19:05 < bridge> And that's only happening on f-ddrace? 19:05 < bridge> I mean, it's unpredicted, so jitter is to be expected i think 19:05 < bridge> i dont know if its only f-ddrace but judging by this it seems like it i guess? 19:05 < bridge> oh - keep in mind i do use antiping 19:05 < bridge> oh let me try with antiping 19:06 < bridge> @essigautomat, did you create the dragger laser update? 19:06 < bridge> no its the same 19:06 < bridge> what's important to show dragger correctly? 19:06 < bridge> EntityEx? 19:06 < bridge> Or DDNetLaser ? 19:07 < bridge> https://github.com/fokkonaut/F-DDrace/issues/345 19:12 < bridge> yes 19:13 < bridge> wtf? Only the subtype 19:15 < bridge> I have no idea how ddnet client determines the subtype, but this shouldn't be 'caused' by my PR. It was just not visible because everything looked the same before 19:16 < bridge> I see, what exactly is broken? 19:23 < bridge> https://github.com/fokkonaut/F-DDrace/blob/f5a592b7ce09540aaa3dc3abbf49bd2e8fb66841/src/game/server/entities/character.cpp#L5285 19:23 < bridge> maybe? 19:25 < bridge> this is used to reduce network traffic of unused/too far away entities that rely on entityEx. 19:25 < bridge> I think the fix would be to send extended Entity always, when type it a dragger. 19:51 < bridge> You can do that in ::SendTeamsState() 19:52 < bridge> check f-ddrace::teams.cpp 19:54 < bridge> are the '||' correct? Looks ambigouous 19:55 < bridge> no, they're correct, why? 19:56 < bridge> I only want to send entityEx of plot objects, if it's the door (always collidable, from outside if closed) or if its not a plot object, or if its the Plot object of the plot you are standing inside 19:57 < bridge> (but plots dont use draggers currently, so i could add a dragger type check in front i think. 19:57 < bridge> By that I mean even around spectator/networkclipped(defaultRange=true). 19:57 < bridge> So that draggers just always get the entityEx and can match type to display square dragger 19:57 < bridge> (assuming thats the issue) 19:59 < bridge> I don't think it's all, does the netmessage contain the lasertype? 20:00 < bridge> I think so, otherwise the color wouldn't even show? 20:00 < bridge> the color is only client side? 20:00 < bridge> I mean, checking Cyberdichters issue (ofar away or in pause) this sounds logical? 20:00 < bridge> Yea, but server sends the type for different colors 20:01 < bridge> from `draweditor` weapon tool for example 20:01 < bridge> yes 20:02 < bridge> where is the subtype saved or do i have to Pass it from dragger snap 20:02 < bridge> will look into it later 20:02 < bridge> oh, can use pEntity->GetObjType == enttype_dragger 20:07 < bridge> ---------- 20:07 < bridge> 20:07 < bridge> If anyone wants to translate F-DDrace, please [check these language files](https://github.com/fokkonaut/F-DDrace/tree/F-DDrace/datasrc/languages) ! 20:07 < bridge> 20:07 < bridge> Already done: english, german, russian, turkish, polish, french (might check for bugs?) 20:07 < bridge> Missing: All other languages DDNet provides 20:08 < bridge> claude.ai definitely helped filling basic strings, and can later be checked and corrected, seemed to be most efficient way 20:25 < bridge> ⛩ #Free cheat ⛩ 20:25 < bridge> The best free cheat server for various games is a large catalog of private 20:25 < bridge> High-quality cheats created by experienced developers 20:25 < bridge> Hat will make your game more productive and comfortable. 🍀 20:25 < bridge> Free private cheats for online games @here @everyone 💖 20:25 < bridge> https://discord.gg/W4aaRYJ6B4 20:52 < bridge> ⛩ #Free cheat ⛩ 20:52 < bridge> The best free cheat server for various games is a large catalog of private 20:52 < bridge> High-quality cheats created by experienced developers 20:52 < bridge> Hat will make your game more productive and comfortable. 🍀 20:52 < bridge> Free private cheats for online games @here @everyone 💖 20:52 < bridge> https://discord.gg/W4aaRYJ6B4 20:53 < bridge> @Discord Mod 22:05 < bridge> steam gift 50$ - [steamcommunity.com/gift/activation/id=69619205](https://u.to/fhc7Ig) 22:05 < bridge> @blaiszephyr ^^^ 22:06 < bridge> :pepeangryping: 22:10 < bridge> your name is literally blue! why would that ever surprise you 22:12 < bridge> :dTeuMonkaW: is this a Cendren styled discussion if i dare say i didn't sign up to be pinged as an individual and we have @ Discord Mod for that 22:13 < bridge> ur name is moderator 22:13 < bridge> i don't understand 22:14 < bridge> it's not some flag of superiority in the chat & game lobbies you enter 22:14 < bridge> nor is it an excuse to take action sometimes & not at others 22:14 < bridge> ignore it, or do what you quite literally applied to do 22:14 < bridge> volunteered, wrote an application for, and continued to roll along with even knowing the expectations 22:14 < bridge> https://tenor.com/view/bunny-huh-gif-5026055331259108593 22:14 < bridge> the discord mod role 22:14 < bridge> goes absolutely nowhere 22:15 < bridge> and that was said last time you said to just ping that role 22:15 < bridge> so either u ignored or didnt read 22:15 < bridge> have a great day Ewan ^^ 22:25 < bridge> Ahm, the Steam update wiped my entire map folder 22:25 < bridge> And all my settings and configs 22:25 < bridge> i was just going to say "this sounds exactly like a Cellegen kind of rant" and then he started typing 22:25 < bridge> actually perfect timing 22:25 < bridge> What patch just removes your configs? 22:26 < bridge> I got all my stuff legit wiped with a patch 22:27 < bridge> its happened to me before too 22:27 < bridge> but not in a loooong time 22:27 < bridge> Ah okay, it's not a DDNet issue, it's a Steam issue 22:28 < bridge> Basically when I mod with Thunderstore, it uses a different Steam executable, thus different folders and configs 22:28 < bridge> it has only happened with steam for me 22:28 < bridge> I think when I modded R.E.P.O, that's how it happened 22:29 < bridge> Also what's the convo above? :kek: 22:30 < bridge> idk Ewan hit the vape too hard 22:30 < bridge> no vape 22:30 < bridge> i got the weed vape 22:30 < bridge> someone pinged mod for mod actions 22:30 < bridge> the msg was deleted 22:30 < bridge> my partner loves her THC vape 22:30 < bridge> melon complained about having been pinged 22:30 < bridge> ill pass it to ewan 22:30 < bridge> ty 22:30 < bridge> https://tenor.com/view/rip-bozo-gif-22294771 22:30 < bridge> (it's empty) 22:30 < bridge> xd 22:31 < bridge> they last so long its kinda pog 22:31 < bridge> lmfao 22:31 < bridge> well, unless you use it like 3 times a day 22:31 < bridge> :justatest: 22:31 < bridge> ig u have never been face to face with an addict 22:31 < bridge> you guys have mod and discord mod, it's kinda clear what each does 22:31 < bridge> the 1g carts would last be 2-3 days 22:31 < bridge> not face to face, but I have met Emile 22:32 < bridge> the 1g carts would last me 2-3 days 22:32 < bridge> i can't be so down bad as to buy the 2g carts so i just stop for a little 22:32 < bridge> wats a cart 22:32 < bridge> i actually know very little about that guy 22:32 < bridge> cartridge 22:32 < bridge> Did you miswrite my name? 22:32 < bridge> ah ok 22:32 < bridge> :troll: 22:32 < bridge> cartridge, or u probably have a disposable, but it's just an all in one operation 22:32 < bridge> the one i have is disposable 22:32 < bridge> often u buy a battery & cartridge yea 22:32 < bridge> cart is pretty sweet if the battery is reliable 22:33 < bridge> https://cdn.discordapp.com/attachments/648031568756998158/1270732421930942659/6P4G4_O1GI095KVU3C9.gif 22:33 < bridge> ewan taking weed 22:33 < bridge> :Clueless: 22:33 < bridge> pulsar dl 2.0 was cheap & reliable so far 22:33 < bridge> how' 22:33 < bridge> oops 22:33 < bridge> how's access in CO? in WA it's everywhere 22:33 < bridge> like every 10 streets or so in cities i swear 22:34 < bridge> dispensaries i mean :justatest: 22:34 < bridge> oh wait 22:34 < bridge> thius is #developer 22:34 < bridge> omg 22:34 < bridge> i thought it was offtopic 22:34 < bridge> get fuckin trolled 22:34 < bridge> we keep it real here 22:34 < bridge> well tbh, #developer is better because it has the bridge 22:35 < bridge> are u murican? 22:35 < bridge> gdin? 22:35 < bridge> im murican yes 22:35 < bridge> i think i have been awfully unsubtle about who i am 22:35 < bridge> maybe ryo needs to clear up his brain RAM a bit, too much coding 22:35 < bridge> i havent checked discord lately 22:35 < bridge> xd 22:35 < bridge> let me give you a hint 22:36 < bridge> i think there are few muricans, broken, gdin, maple (well canadian) 22:36 < bridge> oh 22:36 < bridge> are u noby 22:36 < bridge> XD no 22:36 < bridge> xd 22:36 < bridge> noby has a drug dealer gf 22:36 < bridge> i ragequit the server originally 22:36 < bridge> :greenthing: 22:36 < bridge> hm idk 22:36 < bridge> hi leute is german 22:36 < bridge> we talked a bit 22:37 < bridge> wait maybe i can find this 22:38 < bridge> :greenthing: 22:38 < bridge> spot the linux username 22:39 < bridge> lynn 22:39 < bridge> the streamer? 22:39 < bridge> 👋 22:39 < bridge> yessir 22:39 < bridge> oh ye u were murican 22:39 < bridge> i guess nobody can escape ddnet 22:39 < bridge> i am back and ready to ruin this community again 22:39 < bridge> yep 22:39 < bridge> :owo: 22:40 < bridge> i will eventually learn cpp but i guess i will stick to some easier goals for now xD 22:40 < bridge> lots in the works 22:40 < bridge> xd 22:40 < bridge> learn rust 22:40 < bridge> i mean, i did try 22:40 < bridge> we had a irl meet in germany some devs 22:40 < bridge> the future is rusty 22:40 < bridge> its too brain 22:40 < bridge> i wanna go to FOSDEM next time 22:41 < bridge> i wanna hang out w hein & lear 22:41 < bridge> lets get some beer 22:41 < bridge> i doubt with hein he doesnt drink but with learath ye 22:41 < bridge> and i do too hehe 22:41 < bridge> XD 22:41 < bridge> ah yeah forgot about this 22:41 < bridge> lea and me were the only ones who got some alc 22:41 < bridge> idk why i remember him telling me that 22:42 < bridge> xD 22:42 < bridge> murpi i cant imagine having some physical form 22:42 < bridge> idk why exactly, hes just a sheep to me 22:42 < bridge> murpi wasnt there 22:42 < bridge> i still have that magnet on my pc uwu 22:43 < bridge> its been on my case for years 22:43 < bridge> i have it on my moms house 22:43 < bridge> iirc 22:45 < bridge> i want tee plushie so bad 22:45 < bridge> i guess i should not be lazy and try to make one with that blueprint 22:47 < bridge> chat do i switch to dwm? 22:48 < bridge> i3 22:48 < bridge> anyway lets og to off topic 23:19 < bridge> learn Go 23:19 < bridge> 👀 23:19 < bridge> *shameless advertising* 23:20 < bridge> You sell go? 23:22 < bridge> i like go actually 23:22 < bridge> i read the reference 23:22 < bridge> but never written any 23:31 < bridge> https://www.gopl.io/ that is a great introduction 23:32 < bridge> but slightly outdated, great none the less 23:44 < bridge> Learn Haskell and switch to xmonad (don't) 23:48 < bridge> ew wtf 23:53 < bridge> Learn Emacs and switch to EXWM