00:12 < bridge> @heinrich5991 trikiman's linked video opens the channel just fine, while your's gives me this: 00:12 < bridge> 00:12 < bridge> or did i understand your msg wrong? ^^ 00:12 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1212175502278656010/image.png?ex=65f0e168&is=65de6c68&hm=e6804dd934938c64768a33999071b16a9cf1bc1660a4c80139c4f9955c3483db& 00:12 < bridge> @heinrich5991 trikiman's link opens the channel just fine, while your's gives me this: 00:12 < bridge> 00:12 < bridge> or did i understand your msg wrong? ^^ 00:13 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1212175502278656010/image.png?ex=65f0e168&is=65de6c68&hm=e6804dd934938c64768a33999071b16a9cf1bc1660a4c80139c4f9955c3483db& 00:13 < bridge> you can post it into any discord channel and you'll see the video 00:14 < bridge> oh i see - thanks for the clarification. 00:34 < bridge> i just uploaded it to gh 03:59 < bridge> @chillerdragonadvancedbridgethaticannotping do you know any map reader implementation that is not the official one? Maybe a simpler one XD 04:39 < bridge> you can do `ChillerDragon:` and he will get pinged on IRC 04:40 < bridge> might just be ChillerDragon tbh 06:22 < bridge> :pepehmmm: 07:19 < bridge> You mean like this 07:19 < bridge> https://gitlab.com/Patiga/twmap 07:19 < bridge> I dunno if it's much easier. But probably 07:52 < bridge> https://github.com/Matodor/TeeSharp/blob/refactoring/Examples%2FExamples.Map%2Fsrc%2FProgram.cs 07:57 < ws-client> @miguilim yes twmap is epic. Whats your use case? Read the code to document it? There is some libtw2 docs on the datafile and so on. Maybe matodors C# is easier to read than rust. But id say using twmap python bindings is the easiest to use map code. 07:58 < ws-client> There is also some C++ tools which is less code 07:59 < ws-client> @miguilim all the ones starting with map_* have a single small cpp file interacting with the map code https://github.com/ddnet/ddnet/tree/master/src/tools but its a bit high level 08:00 < ws-client> also ye irc pings are like tw chat 08:01 < ws-client> @heinrich5991 erlang and elixir is webscale its what whatsapp uses 08:01 < ws-client> and everything big scale such as telecommunication services 08:01 < ws-client> if you have trillion of users and need to brrrr erlang is a good tool 08:02 < ws-client> we can use it to port ddnet to 512 slots axaxaxxa 08:19 < bridge> morning 08:24 < bridge> gm 08:24 < bridge> gm 08:32 < bridge> gm 09:04 < bridge> good morning 09:31 < bridge> ```rust 09:31 < bridge> mod Main { 09:31 < bridge> extern fn malloc(bytes: u64) -> *mut u8; 09:31 < bridge> extern fn free(ptr: *mut u8); 09:31 < bridge> 09:31 < bridge> pub fn main(argc: i32, argv: *const *const i32) -> i32 { 09:31 < bridge> let x: *mut u8 = malloc(32); 09:31 < bridge> free(x); 09:31 < bridge> return 0; 09:31 < bridge> } 09:31 < bridge> } 09:31 < bridge> ``` 09:31 < bridge> pog this compiles 09:31 < bridge> im using u8 cuz i dont have casts yet 09:31 < bridge> you can link to libc? 🙂 09:31 < bridge> nice 09:32 < bridge> i link to libc by default 09:32 < bridge> argv should be *const *const u8, I guess? 09:32 < bridge> doesnt rust do that too? 09:32 < bridge> argv should be `*const *const u8`, I guess? 09:32 < bridge> i think its a char so its i32 iirc 09:32 < bridge> yes, rust does that, too 09:32 < bridge> no, C's `char` is a `u8` or `i8` 09:32 < bridge> oh 09:32 < bridge> https://docs.rs/libc/0.2.153/libc/type.c_char.html 09:32 < bridge> true 09:32 < bridge> lol 09:33 < bridge> ```rust 09:33 < bridge> mod Main { 09:33 < bridge> extern fn malloc(size: u64) -> *mut u8; 09:33 < bridge> extern fn free(ptr: *const u8); 09:33 < bridge> 09:33 < bridge> pub fn main(argc: i32, argv: *const *const u8) -> i32 { 09:33 < bridge> let x: *mut u8 = malloc(32); 09:33 < bridge> free(x); 09:33 < bridge> return 0; 09:33 < bridge> } 09:33 < bridge> } 09:33 < bridge> 09:33 < bridge> ``` 09:33 < bridge> ok this makes more sense 09:33 < bridge> ```llvm 09:33 < bridge> ; ModuleID = 'Main' 09:33 < bridge> source_filename = "program.ed" 09:33 < bridge> target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" 09:33 < bridge> target triple = "x86_64-unknown-linux-gnu" 09:33 < bridge> 09:33 < bridge> declare !dbg !2 ptr @malloc(i64) 09:33 < bridge> 09:33 < bridge> declare !dbg !9 void @free(ptr) 09:33 < bridge> 09:34 < bridge> define i32 @main(i32 %0, ptr %1) !dbg !13 { 09:34 < bridge> entry: 09:34 < bridge> call void @llvm.dbg.value(metadata ptr %1, metadata !21, metadata !DIExpression()), !dbg !23 09:34 < bridge> call void @llvm.dbg.value(metadata i32 %0, metadata !19, metadata !DIExpression()), !dbg !24 09:34 < bridge> %return_ptr = alloca i32, align 4, !dbg !25 09:34 < bridge> %argc = alloca i32, align 4, !dbg !24 09:34 < bridge> store i32 %0, ptr %argc, align 4, !dbg !24 09:34 < bridge> %argv = alloca ptr, align 8, !dbg !23 09:34 < bridge> store ptr %1, ptr %argv, align 8, !dbg !23 09:34 < bridge> %x = alloca ptr, align 8, !dbg !26 09:34 < bridge> %temp_var_4 = alloca ptr, align 8, !dbg !26 09:34 < bridge> br label %block_0, !dbg !26 09:34 < bridge> 09:34 < bridge> block_0: ; preds = %entry 09:34 < bridge> %2 = call ptr @malloc(i64 32), !dbg !27 09:34 < bridge> store ptr %2, ptr %temp_var_4, align 8, !dbg !27 09:34 < bridge> br label %block_1, !dbg !27 09:34 < bridge> 09:34 < bridge> block_1: ; preds = %block_0 09:34 < bridge> call void @llvm.dbg.declare(metadata ptr %x, metadata !22, metadata !DIExpression()), !dbg !26 09:34 < bridge> %3 = load ptr, ptr %temp_var_4, align 8, !dbg !28 09:34 < bridge> unoptimized output 09:34 < bridge> ``` 09:34 < bridge> define i32 @main(i32 %0, ptr nocapture readnone %1) local_unnamed_addr #0 !dbg !2 { 09:34 < bridge> entry: 09:34 < bridge> ret i32 0, !dbg !20 09:34 < bridge> } 09:34 < bridge> ``` 09:34 < bridge> optimized xd 09:34 < bridge> ```llvm 09:35 < bridge> define i32 @main(i32 %0, ptr nocapture readnone %1) local_unnamed_addr #0 !dbg !2 { 09:35 < bridge> entry: 09:35 < bridge> ret i32 0, !dbg !20 09:35 < bridge> } 09:35 < bridge> ``` 09:35 < bridge> optimized xd 09:37 < bridge> nice 🙂 09:38 < bridge> C with rusty syntax :justatest: 09:38 < bridge> ye xx 09:39 < bridge> :justatest: 10:02 < bridge> @heinrich5991 lol 10:02 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1212324053101060126/image.png?ex=65f16bc2&is=65def6c2&hm=ed62ed579bb9fb614410d77f10d0a9360ad90c028a3d147de0313afa284f1f09& 10:03 < bridge> already paying off? xd 10:03 < bridge> $170K - $200K • 0.20% - 0.70% 10:03 < bridge> apparently its a ycombinator start up 10:04 < bridge> probably automated 10:04 < bridge> rip 10:04 < bridge> xd 10:05 < bridge> idk anything about ai 10:05 < bridge> tho iguess they want to use rust for processing videos or smth 10:18 < bridge> :justatest: 10:18 < bridge> 0 bytes / 222 gb 10:18 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1212327969243013180/image.png?ex=65f16f67&is=65defa67&hm=5bb9745d7915a4f8fa995263f4a0d5be30d8968863fa92547b37ed9828522c04& 10:18 < bridge> Where is my disk 10:30 < bridge> what happened? ^^ 10:52 < bridge> NTFS xdd 11:10 < bridge> CTRL + MOUSE_WHEEL_UP x20 11:10 < bridge> the zero will disappear and will not bother you :gigachad: 11:46 < bridge> problem solved 😄 11:57 < bridge> I tried to update CLion xd 12:04 < bridge> I can recommend https://windirstat.net/ 12:15 < bridge> I'm using wiztree 12:42 < bridge> `TreeSize Free` are better option I think 12:43 < bridge> `TreeSize Free` is better option I think 12:45 < bridge> windirstat is quite good 12:46 < bridge> Linux is quite good as well 12:54 < bridge> yeah 13:23 < bridge> my new dac is 2.5x the size 13:23 < bridge> `qdirstat` is open-source and pretty much the linux equivalent of windirstate afaik 13:39 < bridge> I use `ncdu` on linux 13:39 < bridge> it works on the command line, and thus also on servers 13:41 < bridge> also, it has earned me tons of points on stackexchange 😅 https://superuser.com/a/490640/123965 14:00 < bridge> lol with one answer your are top 7%.. ez 14:03 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1212384477163298886/image.png?ex=65f1a408&is=65df2f08&hm=216ad67cfd65b530810b5ae5d843e5624278fa8bd9664b9f9cc79379a0f7b0a0& 14:03 < bridge> im top 71% on SO 14:03 < bridge> ♿ 14:04 < bridge> i got cancelled after asking a question for ddnet 14:05 < bridge> 11y 11m 14:05 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1212384967582027858/image.png?ex=65f1a47d&is=65df2f7d&hm=e447bfe87bf81531669f3d178e4f3b944c57dbb3631c395206793f9a37394004& 14:10 < bridge> damn 14:10 < bridge> i think i will never be able to use sleep on this motherboard 14:10 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1212386399907487834/image.png?ex=65f1a5d2&is=65df30d2&hm=3dc7827a85fa12a0cef3c978f6985212a4161ca6c6e21c77eb75adbdce33df81& 14:10 < bridge> i thought maybe i could override it by changing the acpi dsdt table but i don't want to risk bricking it 14:11 < bridge> and i cannot get support because i bought it second hand 14:11 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1212386515343249418/image.png?ex=65f1a5ee&is=65df30ee&hm=0f849748bb163f7fb906270c6a8184673523fcbe1804ab2fc38b53f2bc97d9b3& 14:11 < bridge> so i can't even ask a question about it lol 14:11 < bridge> no mention of sleep anywhere in the bios 14:12 < bridge> my motherboard is so out there i've literally not even found a single other person who has one 14:32 < bridge> I Just realised we Had a Huge Wave of new dev roles:o 14:33 < bridge> 😏 14:40 < bridge> How members can promote for Dev role ? 14:40 < bridge> contribute 14:40 < bridge> https://github.com/ddnet/ddnet/ 14:40 < bridge> Contribute and say: discord gods i contributed 14:41 < bridge> Milkey i am so proud of you ❤️ 14:41 < bridge> you better dont 14:41 < bridge> :justatest: 14:41 < bridge> i deleted line from ci 14:41 < bridge> akshually 2 14:41 < bridge> one line was a comment 14:42 < bridge> My First commit was a cmake Warning 🥴 14:42 < bridge> i aint opening that monstrosity 14:43 < bridge> don't even remember why I'm in the credits 14:44 < bridge> what lsp u use for pyson? 😄 14:44 < bridge> if anyone is pyson andy here 14:45 < bridge> Python or pyson? 14:45 < bridge> python 14:45 < bridge> im not using lsp for python 14:45 < bridge> whenever im writing python 14:45 < bridge> im probably remoted 14:45 < bridge> just write in nano without even syntax highlighting 14:46 < bridge> might be useful calling it python 14:46 < bridge> is there pyson programming language? 14:46 < bridge> Pyright is the one Ive been using with nvim/emacs 14:46 < bridge> pyson is a libary for managing json files 14:47 < bridge> There is a json lib called pyson 14:47 < bridge> ^ 14:47 < bridge> has anyone tired to setup his dev env with wsl (linux subsystem) ? 14:48 < bridge> Use an ide that supports WSL2 14:48 < bridge> neovim :gigachad: 14:48 < bridge> Shush 14:48 < bridge> ig ill use pyright 14:48 < bridge> vs code does that 14:49 < bridge> Yea, you only need to know the basics of bash and you can set it Up 14:50 < bridge> I already did on #7937 is that enough or not ? 14:50 < bridge> https://github.com/ddnet/ddnet/pull/7937 14:50 < bridge> If you want to Code clientsided (graphical) - you would need to Setup an xServer, OR Cross compile to Windows 14:50 < bridge> More than i did on my First commit - wait let me Look it Up 14:51 < bridge> :owo: 14:53 < bridge> Your first PR was that rename commit ? 14:53 < bridge> XD ye 14:54 < bridge> then you promoted to dev ? 14:54 < bridge> Im only doing small refactors on ddnet code, i cba to do more than 50 loc because i dont Like beeing torn apart for my Shit Code 14:55 < bridge> Meh it was a meme between me and furo 14:55 < bridge> He Said j should contribute to get Dev role, and Here i am 14:55 < bridge> oh I see now then it make sense now 😄 14:56 < bridge> You need to make more PRs! 14:57 < bridge> Melon gonna get demote I think 😛 15:02 < bridge> btw Melon senpai I like your commits ❤️ 15:07 < bridge> i don't think it's really like that 15:12 < bridge> from https://discord.com/channels/252358080522747904/1125706766999629854/1147096614238957621: 15:12 < bridge> > <@&293541515781996568>: Assigned to users with accepted pull requests on our main repository. 15:12 < bridge> I don't think you can stop qualifying for this role 15:15 < bridge> So if i suggest you to give vexar the Dev role for his PR #7937 15:15 < bridge> 15:15 < bridge> He can't undo it? 😉 15:15 < bridge> https://github.com/ddnet/ddnet/pull/7937 15:20 < bridge> tnx ❤️ 15:30 < bridge> ``` 15:30 < bridge> twgpu-map-photography.exe .\Basketball.map . 15:30 < bridge> Error: IoError(Os { code: 2, kind: NotFound, message: "The system cannot find the file specified." }) 15:30 < bridge> ``` 15:30 < bridge> but why ? 15:31 < bridge> is there a private repo for ddnet antibot or where is it? :justatest: 15:36 < bridge> Is the map in your current directory? 15:36 < bridge> got 4 accepted prs :sad: 15:37 < bridge> yes 15:38 < bridge> And the last dot is for mapres? 15:39 < bridge> no I thought that save location for photo 15:39 < bridge> I put . to save it in same directory 15:39 < bridge> @mpft :owo: 15:39 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1212408832832049192/PXL_20240228_143927853.jpg?ex=65f1bab7&is=65df45b7&hm=4872e3932c6f2e76cf09abd4cfd1d03f3bda6672ec12218da6745f2318bdcad9& 15:40 < bridge> sweet 15:40 < bridge> does it sound 15:40 < bridge> what does that mean 15:40 < bridge> idk 15:40 < bridge> this one has rca for my monitors 15:40 < bridge> and big jack for my headset 15:40 < bridge> sweet 15:40 < bridge> before i had to use jack to mini jack 15:40 < bridge> yea that's common 15:40 < bridge> those things are usually so shitty 15:40 < bridge> the adapters 15:40 < bridge> glad u dont have to use that 15:41 < bridge> @patiga 15:41 < bridge> gnome-remote-desktop not supported on clear linux 15:41 < bridge> :feelsbadman: 15:42 < bridge> the repo is private, yes 15:42 < bridge> tnx fixed was my mistake 15:42 < bridge> do u guys share antibot code with other servers 15:42 < bridge> thank you too ❤️ 15:42 < bridge> noby did some of the ddnet antibot right 15:44 < bridge> oh shit nvm it's just in a separate pkg for some reason 15:45 < bridge> it's onby's antibot with some changes by ddnet 15:46 < bridge> new old devs xd 15:47 < bridge> :justatest: :justatest: :justatest: :justatest: 15:47 < bridge> :justatest: 15:47 < bridge> me when gerdoe still doesn't have dev role 15:48 < bridge> :thonk: 15:48 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1212410991661289502/image.png?ex=65f1bcb9&is=65df47b9&hm=dd7bdd79afcfc97b781b5c104eaeb14413db067ae680da4d47c6ee81c0116d20& 15:50 < bridge> nah, heinrich gave it to me couple days ago 15:51 < bridge> i still can't get my prs be merged because uni eats a lot of time for some reason 16:03 < bridge> awesome that you use the tool. may I ask what you are experimenting with? :D 16:09 < bridge> I was trying create my own discord bot to upload or update maps without connect to my vps or adding map to my votelist manually and I want to set uploaded map's photo to channel by using your tools (tnx for twmap tools <3) 16:10 < bridge> sounds cool, gl with your project :) 16:10 < bridge> tnx 🤗 🥰 16:36 < bridge> Closed source, boo.. 16:37 < bridge> I shared you my repo, share me antibot repo :troll: 16:48 < bridge> what to do with merge conflicts on #7820? 16:48 < bridge> https://github.com/ddnet/ddnet/pull/7820 16:48 < bridge> [github.com/ddnet-leaks/antibot](https://m.youtube.com/watch?v=dQw4w9WgXcQ&pp=ygUJcmljayByb2xs) 16:48 < bridge> xd 16:48 < bridge> too late 16:48 < bridge> Mobile 16:49 < bridge> you forgot https:// 16:49 < bridge> Discord disabled that 16:49 < bridge> uh oh 16:49 < bridge> Now delete msg xd 16:53 < bridge> https://cdn.discordapp.com/emojis/1170067019446632548.webp?size=48&quality=lossless 16:56 < bridge> what functionality does this add 16:57 < bridge> why do i feel that rescue functionality is going to be overcomplicated 16:57 < bridge> best option imo is to allow for /spawnpoint like in trainfng 16:58 < bridge> there's nothing to overcomplicate 16:59 < bridge> rescumode used for switching between auto (current behaviour of rescue) and manual (new behaviour of rescue that works exactly like setting spawnpoint by writing /r(escue) so you have no need to bind anything new) 16:59 < bridge> oh 🙏 17:00 < bridge> `ddracechat.h` was deleted, so to resolve the conflict you need to deleted the file and add the command registration in `gamecontext.cpp` instead (it conflicts because of #7919) 17:00 < bridge> https://github.com/ddnet/ddnet/pull/7919 17:00 < bridge> it will rescue you if you are midair/freezed 17:00 < bridge> and will set your rescue position if you are grounded 17:00 < bridge> `ddracechat.h` was deleted, so to resolve the conflict you need to delete the file and add the command registration in `gamecontext.cpp` instead (it conflicts because of #7919) 17:01 < bridge> oh 17:01 < bridge> thank you for notice lol 17:01 < bridge> i would never see it myself 17:10 < bridge> was the kill tile rescue ever solved 17:11 < bridge> ewan tried to do something but was stopped by someone i don't recall 17:11 < bridge> el heino 17:11 < bridge> i will try to implement it rn 17:11 < bridge> don't 17:12 < bridge> unless u do it exactly how he wants 17:12 < bridge> someone already did it before me and i didn't know till i was done 17:13 < bridge> see 7691 17:13 < bridge> #7691 17:13 < bridge> https://github.com/ddnet/ddnet/pull/7691 17:14 < bridge> i wish i had 100 mbit/s connection instead of 20 kbit/s 17:14 < bridge> see also https://github.com/ddnet/ddnet/issues/3024 17:24 < bridge> > I think we shouldn't trigger rescue automatically. The player should rather press /r explicitly after they died, we could keep them in spectator mode until they do. 17:24 < bridge> why though 17:25 < bridge> i wouldn't like to test any faily part with such because i would always press button instead of going as is 17:25 < bridge> like 17:25 < bridge> use super instead 17:27 < bridge> > Auto-respawning is going to interact badly, e.g. if you respawn in speeders that push you into a death tile, that's a nice way to generate a lot of messages. 17:27 < bridge> since there's a lot cases of "rescuing" in kill tile i can just implement both with use of /rescuemode 17:27 < bridge> both cases are annoying 17:28 < bridge> the same way you don't get auto-rescued when you hit freeze 17:28 < bridge> if you get auto-rescued, you might still hook in some direction, causing unintentional movement 17:28 < bridge> I suggest you comment on the github issue if you want the discussion to last 17:29 < bridge> which one xd 17:29 < bridge> theres at least 3 17:29 < bridge> are there? 17:29 < bridge> I mean this: https://github.com/ddnet/ddnet/issues/3024 17:29 < bridge> newest discussion https://github.com/ddnet/ddnet/pull/7691 17:29 < bridge> that's a pull request 17:29 < bridge> comment on the issue 17:30 < bridge> #2232 and #3024 17:30 < bridge> https://github.com/ddnet/ddnet/issues/2232 17:30 < bridge> https://github.com/ddnet/ddnet/issues/3024 17:32 < bridge> I closed the duplicate 17:34 < bridge> @ryozuki @heinrich5991 :Pog: 17:34 < bridge> https://blog.cloudflare.com/pingora-open-source 17:36 < bridge> pog 17:36 < bridge> > Security is your top priority: Pingora is a more memory safe alternative for services that are written in C/C++. While some might argue about memory safety among programming languages, from our practical experience, we find ourselves way less likely to make coding mistakes that lead to memory safety issues. Besides, as we spend less time struggling with these issues, we are more productive implementing new features. 17:36 < bridge> > 17:36 < bridge> > Your service is performance-sensitive: Pingora is fast and efficient. As explained in our previous blog post, we saved a lot of CPU and memory resources thanks to Pingora’s multi-threaded architecture. The saving in time and resources could be compelling for workloads that are sensitive to the cost and/or the speed of the system. 17:36 < bridge> > 17:37 < bridge> > Your service requires extensive customization: The APIs that the Pingora proxy framework provides are highly programmable. For users who wish to build a customized and advanced gateway or load balancer, Pingora provides powerful yet simple ways to implement it. We provide examples in the next section. 17:38 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1212438630908436531/Rock-crab-pingora-open-source-mascot.png?ex=65f1d677&is=65df6177&hm=56996fce06d02aad529c61531acb2a1eb0373a4c8a5ff84c4200d02c655bcc73& 17:38 < bridge> nice logo xd 17:46 < bridge> https://www.gobolinux.org/ 17:49 < bridge> @heinrich5991 can you check last conversation on 7820? 17:51 < bridge> i will commit last change and then squash commits 18:15 < bridge> ``` 18:15 < bridge> Query id: f441b2cb-9ede-41d6-a781-c3475245604a 18:15 < bridge> 18:15 < bridge> ┌─client_name─────┬─client_playtime_total_hours─┐ 18:15 < bridge> │ nameless tee │ 35311.90416666667 │ 18:15 < bridge> │ 1 │ 10661.709722222224 │ 18:15 < bridge> │ ChillerDragon │ 10318.552777777777 │ 18:15 < bridge> │ brainless tee │ 9041.169444444444 │ 18:15 < bridge> │ . │ 7737.541666666667 │ 18:15 < bridge> │ kais │ 5385.254166666667 │ 18:15 < bridge> │ chillerbot-zx │ 5193.144444444445 │ 18:15 < bridge> │ 异教 │ 4978.847222222222 │ 18:15 < bridge> │ Colo-Colo │ 4602.886111111112 │ 18:15 < bridge> │ (1)nameless tee │ 4269.986111111111 │ 18:15 < bridge> │ (1)kais │ 4218.841666666666 │ 18:15 < bridge> │ wlszd │ 4062.551388888889 │ 18:15 < bridge> │ Bonobobo │ 3995.2569444444443 │ 18:15 < bridge> │ ]GameReady[ │ 3940.2708333333335 │ 18:15 < bridge> │ 月满 │ 3849.2597222222225 │ 18:15 < bridge> │ 123 │ 3763.597222222222 │ 18:15 < bridge> │ 峰峰 │ 3735.4902777777775 │ 18:16 < bridge> │ prore │ 3432.5333333333333 │ 18:16 < bridge> │ Noob Redis │ 3403.4375 │ 18:16 < bridge> │ 7% │ 3392.561111111111 │ 18:16 < bridge> └─────────────────┴─────────────────────────────┘ 18:16 < bridge> 18:16 < bridge> 20 rows in set. Elapsed: 1.790 sec. Processed 9.75 million rows, 248.63 MB (5.44 million rows/s., 138.89 MB/s.) 18:16 < bridge> Peak memory usage: 311.27 MiB. 18:16 < bridge> ``` 18:16 < bridge> 18:16 < bridge> ChillerDragon: afk king? :gigachad: 18:24 < bridge> seems sus 18:25 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1212450382849245194/image.png?ex=65f1e169&is=65df6c69&hm=fbe599ea7a9447766b5cc2d6d09f2c7882733d46f9d3f72a2f1491fa793a6f06& 18:25 < bridge> 🇩🇪 18:27 < bridge> `"accessibilityData":{"label":"Never Gonna Give You Up - Rick Astley (Lyrics) 🎵 – Short abspielen"}` 18:27 < bridge> hmmmm 18:28 < bridge> `"accessibilityData":{"label":"Never Gonna Give You Up - Rick Astley (Lyrics) 🎵 – Short abspielen"}` 18:28 < bridge> hmmmm 18:29 < bridge> `"accessibilityData":{"label":"Newest AntiBot leaks directly from Heinrich5991"}` 18:29 < bridge> hmmmm 18:29 < bridge> `"accessibilityData":{"label":"Newest AntiBot leaks directly from heinrich5991"}` 18:29 < bridge> hmmmm 18:29 < bridge> it works!!!! thank you so much 18:32 < bridge> from when is this 18:33 < bridge> 2022, 11, 19 18:33 < bridge> also thats like 18:33 < bridge> 2022-11-19 18:33 < bridge> half of that is just blmapchill players 18:34 < bridge> imagine to have your own master server and ban players from it if they play on blmapchill more than 1k hours xd 18:35 < bridge> only ddnet servers? 18:35 < bridge> we have an inflation of purple names xd 18:35 < bridge> can we make dev yellow 18:35 < bridge> only from master server stats 18:35 < bridge> gimme green 18:35 < bridge> and give me the purple jupstar role 18:36 < bridge> is it ok to have 80+ changes after running fix_style.py 18:36 < bridge> so kog should be included right? 18:36 < bridge> + 18:36 < bridge> is it only from 1 year? 18:36 < bridge> Did you use clang-format10? 18:36 < bridge> ik i have lot more than 5k hours 18:36 < bridge> ik i have lot more than 5k hours ingame 18:37 < bridge> where kog grinders 18:37 < bridge> i've more 18:37 < bridge> 😬 18:37 < bridge> 2022-11-19 first time when master server started support skin info 18:37 < bridge> i didnt assume you had less xd 18:37 < bridge> can you get new info? 18:38 < bridge> which one? 18:38 < bridge> all times 18:38 < bridge> online time 18:38 < bridge> no, but clang-format16 18:38 < bridge> from all players ranked 18:38 < bridge> from all players 18:39 < bridge> Yeah, that won't work. You will need version 10. 18:39 < bridge> how can i install clang-format10 on fedora 18:41 < bridge> I got mine from here, . Then just copied the `clang-format-10_linux-amd64` binary to `/usr/bin/clang-format-10`. 18:43 < bridge> thank you a lot furo 18:44 < bridge> btw why does ddnet use clang format 10 and why their behaviour changes this way lmao 18:44 < bridge> 18:45 < bridge> it's crazy 18:45 < bridge> they should jusst disable style checks until it's fixed 18:45 < bridge> or run it themselves in a 18:46 < bridge> i wish we had a bot that runs fix style before merging 18:47 < bridge> ``` 18:47 < bridge> SELECT (sum(client_playtime_sec) / 60) / 60 AS client_playtime_total_hours 18:47 < bridge> FROM tee_skin.client_snapshots 18:47 < bridge> WHERE startsWith(lower(server_map_name), 'blmap') 18:47 < bridge> 18:47 < bridge> Query id: 26855dd8-1c89-4a75-b778-90dbca05092d 18:47 < bridge> 18:47 < bridge> ┌─client_playtime_total_hours─┐ 18:47 < bridge> │ 525239.1666666666 │ 18:48 < bridge> └─────────────────────────────┘ 18:48 < bridge> 18:48 < bridge> 1 row in set. Elapsed: 229.714 sec. Processed 12.63 billion rows, 229.06 GB (54.97 million rows/s., 997.15 MB/s.) 18:48 < bridge> Peak memory usage: 19.40 MiB. 18:48 < bridge> ``` 18:48 < bridge> :wtf: 19:05 < bridge> 60 years, but Multeasymap players total playtime since 2022-11-19 - 180+ years 😄 19:05 < bridge> 19:05 < bridge> ``` 19:05 < bridge> ┌─client_playtime_total_hours─┐ 19:05 < bridge> │ 1708114.6722222222 │ 19:05 < bridge> └─────────────────────────────┘ 19:05 < bridge> ``` 19:17 < bridge> awesome 19:17 < bridge> losers 19:24 < bridge> yet another 180 human-years wasted xd 19:25 < bridge> not the worst though 19:25 < bridge> i just finished reading it, very happy story :feelsbadman: 19:32 < bridge> idk why my audio suddenly stopped working 19:32 < bridge> tried my dac on the mac and it works.. 19:39 < bridge> it doesnt make any sense 19:47 < bridge> It's not crazy, a lot of projects stick with a version of clang-format, that's why that repository exists 19:56 < bridge> is it alright about `CGameContext::OnMapChange(...)` being called before map change even if map couldn't be load 19:59 < bridge> ed* 20:09 < bridge> ig not because map settings are loaded on this call so if you have map settings but not the map itself it will affect current running map 20:13 < bridge> Looks correct, `OnMapChange` reads the map settings from `cfg` files and writes them to the `map` file, which needs to happen before the map is loaded. Maybe should be renamed to `BeforeMapChange` or `PrepareMapChange` instead. 20:15 < bridge> If you need to add behavior that happens after map change then you should probably put that in `OnInit` instead 20:16 < bridge> see #7986 20:16 < bridge> https://github.com/ddnet/ddnet/pull/7986 20:17 < bridge> ig its caused only by database operations being done in other thread but idk why data changes 20:21 < bridge> `CScore::SaveTeam` saves `g_Config.m_SvMap` as the map, which is already the new map when `LoadMap` is called 20:24 < bridge> Seems like all save commands might end up saving the wrong map if the map config variable is changed at the same time 20:24 < bridge> but wait `g_Config.m_SvMap` is changed after `CGameContext::OnMapChange(...)` call not before 20:26 < bridge> The config variable is changed first via the console, which calls `ConchainMapUpdate`, which sets `m_MapReload = true` if the map has changed 20:27 < bridge> ah right 20:27 < bridge> its strange though 20:27 < bridge> `pNewMapName` is just useless 20:28 < bridge> Seems more correct to pass `CServer::m_aCurrentMap` as an argument to those `CScore` functions instead of using the config 20:28 < bridge> It's still used though, the function can create a temporary map, in which case the path to the map will be changed before loading it 20:28 < bridge> The whole thing is weird though, having to load the cfg settings and writing those back to the maps 20:29 < bridge> i mean both `pNewMapName` and `g_Config.m_SvMap` are used and its strange 20:30 < bridge> `pNewMapName` is the output for the function, but it shouldn't modify the value of the config variable 20:33 < bridge> yeah you are right, didn't even notice it's `char *` 20:33 < bridge> I very much doubt accessing the config from multiple threads is sane at all 20:33 < bridge> its not used from other thread but in data preparation 20:34 < bridge> and if you will save tick-a-tick on map change you'll get wrong save 20:34 < bridge> but still usable 20:35 < bridge> is it real though xd 20:36 < bridge> oy vey `Server()->GetMapName()` is also `g_Config` 20:36 < bridge> Seems possible, but netmessage that changes the map would have to be handled before the message triggering a save/load 20:36 < bridge> Seems possible, the netmessage that changes the map would have to be handled before the message triggering a save/load 20:42 < bridge> should i add `GetCurrentMapName` to the server interface? 20:43 < bridge> its kinda cursed to have two different map names 20:46 < bridge> @learath2 are u a pipewire pro? 20:46 < bridge> idk why my new dac suddenly stopped playing audio, my old one works 20:47 < bridge> and the new with mac works 20:47 < bridge> so it must be smth with linux/pipewire 20:47 < bridge> wouldn't say pro, but I know how it works-ish 20:50 < bridge> mm maybe i need the power supply 20:50 < bridge> ill try tomorrow 21:09 < bridge> did you check that there isn't an issue on the usb layer? as in it gets detected and the correct driver handles it? 21:10 < bridge> I'd say `GetMapName` should use `m_aCurrentMap` instead of `g_Config.m_SvMap`, since using the config variable anywhere potentially leads to issues with it not being synchronized with the current map 21:10 < bridge> it even shows up on pavucontrol 21:10 < bridge> and it says audio plays 21:10 < bridge> but nothing 21:10 < bridge> did you check that it gets properly wired up in something like qpwgraph? 21:11 < bridge> also did you check dmesg? 21:12 < bridge> @learath2 my dmesg is weird 21:12 < bridge> [ 4827.702753] evbug: Event. Dev: input15, Type: 0, Code: 0, Value: 0 21:12 < bridge> [ 4827.772751] evbug: Event. Dev: input15, Type: 4, Code: 4, Value: 458768 21:12 < bridge> [ 4827.772754] evbug: Event. Dev: input15, Type: 1, Code: 50, Value: 1 21:12 < bridge> [ 4827.772755] evbug: Event. Dev: input15, Type: 0, Code: 0, Value: 0 21:12 < bridge> [ 4827.832751] evbug: Event. Dev: input15, Type: 4, Code: 4, Value: 458760 21:12 < bridge> [ 4827.832754] evbug: Event. Dev: input15, Type: 1, Code: 18, Value: 1 21:12 < bridge> [ 4827.832756] evbug: Event. Dev: input15, Type: 0, Code: 0, Value: 0 21:12 < bridge> [ 4827.892752] evbug: Event. Dev: input15, Type: 4, Code: 4, Value: 458768 21:12 < bridge> [ 4827.892755] evbug: Event. Dev: input15, Type: 1, Code: 50, Value: 0 21:12 < bridge> [ 4827.892756] evbug: Event. Dev: input15, Type: 0, Code: 0, Value: 0 21:12 < bridge> [ 4827.894750] evbug: Event. Dev: input15, Type: 4, Code: 4, Value: 458760 21:12 < bridge> [ 4827.894752] evbug: Event. Dev: input15, Type: 1, Code: 18, Value: 0 21:12 < bridge> [ 4827.894753] evbug: Event. Dev: input15, Type: 0, Code: 0, Value: 0 21:12 < bridge> [ 4828.005751] evbug: Event. Dev: input15, Type: 4, Code: 4, Value: 458774 21:12 < bridge> [ 4828.005753] evbug: Event. Dev: input15, Type: 1, Code: 31, Value: 1 21:12 < bridge> [ 4828.005755] evbug: Event. Dev: input15, Type: 0, Code: 0, Value: 0 21:12 < bridge> [ 4828.070749] evbug: Event. Dev: input15, Type: 4, Code: 4, Value: 458774 21:12 < bridge> [ 4828.070751] evbug: Event. Dev: input15, Type: 1, Code: 31, Value: 0 21:12 < bridge> [ 4828.070752] evbug: Event. Dev: input15, Type: 0, Code: 0, Value: 0 21:12 < bridge> [ 4828.174749] evbug: Event. Dev: input15, Type: 4, Code: 4, Value: 458762 21:12 < bridge> [ 4828.174752] evbug: Event. Dev: input15, Type: 1, Code: 34, Value: 1 21:12 < bridge> [ 4828.174754] evbug: Event. Dev: input15, Type: 0, Code: 0, Value: 0 21:12 < bridge> [ 4828.240751] evbug: Event. Dev: input15, Type: 4, Code: 4, Value: 458792 21:12 < bridge> [ 4828.240754] evbug: Event. Dev: input15, Type: 1, Code: 28, Value: 1 21:12 < bridge> [ 4828.240755] evbug: Event. Dev: input15, Type: 0, Code: 0, Value: 0 21:13 < bridge> [ 4828.253746] evbug: Event. Dev: input15, Type: 4, Code: 4, Value: 458762 21:13 < bridge> [ 4828.253749] evbug: Event. Dev: input15, Type: 1, Code: 34, Value: 0 21:13 < bridge> [ 4828.253750] evbug: Event. Dev: input15, Type: 0, Code: 0, Value: 0 21:13 < bridge> it only shows this xd 21:13 < bridge> what even is input15? :d 21:13 < bridge> what is evbug 21:13 < bridge> is smth broken? 21:13 < bridge> evbug is iirc livevent 21:13 < bridge> some input device is triggering an assert inside it I guess 21:13 < bridge> Oh actually it's probably not a bug 21:14 < bridge> I think you may have enabled event debugging in your kernel 21:14 < bridge> oh i did 21:15 < bridge> what was the setting 21:21 < bridge> [ 1.299849] hid-generic 0003:20B1:3008.0001: hiddev96,hidraw0: USB HID v1.10 Device [iFi (by AMR) iFi (by AMR) HD USB Audio] on usb-0000:2d:00.3-4/input3 21:21 < bridge> @learath2 21:23 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1212495206646292511/image.png?ex=65f20b28&is=65df9628&hm=a5b33f1f8f0b506614fab38db126acda42e613ada7e042e005442aaae43cf6dc& 21:23 < bridge> @learath2 its ifi 21:23 < bridge> should playback be connected? 21:24 < bridge> if i start a vid it shows 21:24 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1212495458333622352/image.png?ex=65f20b64&is=65df9664&hm=c31859340ef93f35ac96936882c013adda4e3ea12fbcb37db50b97d9660dab11& 21:25 < bridge> xd 21:25 < bridge> well with pavucontrol closed its simpler 21:25 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1212495848991101009/image.png?ex=65f20bc1&is=65df96c1&hm=038f29f202e5ea9719ca6bb64e158efdf0a39e26c5f7a57a97218cc3ed7974ef& 21:26 < bridge> whats a monitor? 21:29 < bridge> disconnecting and reconnecting 21:29 < bridge> ``` 21:29 < bridge> [ 611.504262] usb 3-4: USB disconnect, device number 2 21:29 < bridge> [ 615.890835] usb 3-4: new high-speed USB device number 3 using xhci_hcd 21:29 < bridge> [ 616.019623] usb 3-4: New USB device found, idVendor=20b1, idProduct=3008, bcdDevice= 7.40 21:29 < bridge> [ 616.019628] usb 3-4: New USB device strings: Mfr=1, Product=3, SerialNumber=2 21:29 < bridge> [ 616.019630] usb 3-4: Product: iFi (by AMR) HD USB Audio 21:29 < bridge> [ 616.019632] usb 3-4: Manufacturer: iFi (by AMR) 21:29 < bridge> [ 616.019633] usb 3-4: SerialNumber: 0003 21:29 < bridge> [ 616.232121] usb 3-4: 1:4 : unsupported format bits 0x100000000 21:29 < bridge> [ 616.333370] usb 3-4: Warning! Unlikely big volume range (=32512), cval->res is probably wrong. 21:29 < bridge> [ 616.333373] usb 3-4: [10] FU [iFi (by AMR) HD USB Audio Playback Volume] ch = 2, val = -32512/0/1 21:29 < bridge> [ 616.336368] usb 3-4: Warning! Unlikely big volume range (=32512), cval->res is probably wrong. 21:29 < bridge> [ 616.336371] usb 3-4: [10] FU [iFi (by AMR) HD USB Audio Playback Volume] ch = 1, val = -32512/0/1 21:29 < bridge> [ 616.339138] hid-generic 0003:20B1:3008.0008: hiddev96,hidraw0: USB HID v1.10 Device [iFi (by AMR) iFi (by AMR) HD USB Audio] on usb-0000:2d:00.3-4/input3 21:29 < bridge> ``` 21:30 < bridge> xd 21:59 < bridge> seems m_aCurrentMap is also affected for some reason 22:01 < bridge> Hmm, it shouldn't be. The only `str_copy(m_aCurrentMap, ...)` is after `OnMapChange` has been called. 22:01 < bridge> yeah i see, but problem is still here 22:02 < bridge> maybe i did something wrong though 22:02 < bridge> Add `dbg_msg` in multiple places to find out the order of operations I guess 22:06 < bridge> its changed before `LoadMap(...)` is called 22:06 < bridge> its being changed* 22:09 < bridge> That doesn't seem right, I only seem two write accesses to `m_aCurrentMap`, one in the `CServer` constructor and the other in `LoadMap`. 22:09 < bridge> That doesn't seem right, I only see two write accesses to `m_aCurrentMap`, one in the `CServer` constructor and the other in `LoadMap`. 22:12 < bridge> `m_aCurrentMap` has to be unchanged when `LoadMap` fails because it's used to restore the previous value of `sv_map` if the map failed to load 22:12 < bridge> yeah im dumb sorry 22:12 < bridge> instead of```cpp 22:12 < bridge> // get the name of the map without his path 22:12 < bridge> const char *pMapShortName = m_aCurrentMap; 22:12 < bridge> for(int i = 0; i < str_length(m_aCurrentMap) - 1; i++) 22:12 < bridge> { 22:12 < bridge> if(Config()->m_SvMap[i] == '/' || Config()->m_SvMap[i] == '\\') 22:12 < bridge> pMapShortName = &m_aCurrentMap[i + 1]; 22:13 < bridge> } 22:13 < bridge> return pMapShortName;``` 22:13 < bridge> i did 22:13 < bridge> 22:13 < bridge> ```cpp 22:13 < bridge> // get the name of the map without his path 22:13 < bridge> const char *pMapShortName = &Config()->m_SvMap[0]; 22:13 < bridge> for(int i = 0; i < str_length(Config()->m_SvMap) - 1; i++) 22:13 < bridge> { 22:13 < bridge> if(Config()->m_SvMap[i] == '/' || Config()->m_SvMap[i] == '\\') 22:13 < bridge> pMapShortName = &m_aCurrentMap[i + 1]; 22:13 < bridge> } 22:13 < bridge> return pMapShortName;``` 22:13 < bridge> Both don't look right though 22:14 < bridge> They both mix usage of the cfg variable and `m_aCurrentMap` 22:14 < bridge> yep... 22:14 < bridge> Should only use `m_aCurrentMap` 22:15 < bridge> ```cpp 22:15 < bridge> // get the name of the map without his path 22:15 < bridge> const char *pMapName = m_aCurrentMap; 22:15 < bridge> const char *pMapShortName = pMapName; 22:15 < bridge> for(int i = 0; i < str_length(pMapName) - 1; i++) 22:15 < bridge> { 22:15 < bridge> if(pMapName[i] == '/' || pMapName[i] == '\\') 22:15 < bridge> pMapShortName = &pMapName[i + 1]; 22:15 < bridge> } 22:15 < bridge> return pMapShortName;``` 22:20 < bridge> @ryozuki 2nd result on google already... nice push :lol: 22:20 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1212509577430568960/image.png?ex=65f2188a&is=65dfa38a&hm=779c9db729b3c8eee25de00ada95fd7739d4883e2053f42d1c7b3b6191df353a& 22:22 < bridge> nice to see you coding with mouse 😬 22:24 < bridge> xd 22:34 < bridge> seems ddnet-saves is too hardcoded to be usable with this feature 22:34 < bridge> fancy custom packet sounds better than parsing the actual chat xd 22:35 < bridge> also client will get wrong current map name since he gets the message after map change, not before 22:37 < bridge> why not send the message before the map change? 22:40 < bridge> idk ask the jobpool running insert on database xd 22:41 < bridge> This looks correct 22:41 < bridge> its callback from `CScore` so i should run this job blocking or use it as is 22:42 < bridge> not blocking 22:42 < bridge> monitor lines are outputs of what is currently playing on that device, as in "they monitor outputs and clone them" 22:42 < bridge> but perhaps you can directly sned the save code, before the save finishes 22:42 < bridge> CC @zwelf2 22:42 < bridge> This looks like the issue to me 22:42 < bridge> yeah but what if save will not be written both on backup and main databases 22:43 < bridge> what then? ^^ 22:43 < bridge> you'll have useless row in your ddnet-saves.txt and players complaints xd 22:43 < bridge> we'll also have that when the feature fails otherwise 22:44 < bridge> the complaints 22:44 < bridge> its clear for me kekw 22:44 < bridge> the thing unclear is that why ddnet client parses chat to get codes 22:45 < bridge> fix it 😉 22:45 < bridge> and if it does so why doesnt server send map name and teammates names on every response xd 22:45 < bridge> back-compat? 22:45 < bridge> because the map name is clear 22:45 < bridge> it's the current map 22:45 < bridge> i see 22:45 < bridge> what about players xd 22:46 < bridge> you can absolutely fix it if you want. you'll need backcompat though, yes 22:46 < bridge> i will break this way or another 22:46 < bridge> its literally nailed 22:46 < bridge> should i add new version macro define like `LEGACY_SAVE_CODE` or something 22:47 < bridge> yes 22:48 < bridge> but sending the chat message before the map change also sounds sensible 22:48 < bridge> the chat message itself differs though 22:48 < bridge> ah, why? 22:51 < bridge> `CScore::Save(...)` behaviour 22:52 < bridge> `CScore::SaveTeam(...)` behaviour 22:52 < bridge> `"Team save in progress. You'll be able to load with '/load %s'"` 22:56 < bridge> are you saying that this is what the code currently does? you're changing the code, you can change anything 😉 22:58 < bridge> true, i need to figure out why the hell it executes after map change and not before 23:00 < bridge> I think it is doing that because the database operation can take long 23:00 < bridge> and thus it executes in another thread 23:03 < bridge> `SaveTeam` is called from main thread though 23:03 < bridge> it should send the message immediately 23:03 < bridge> ah 23:06 < bridge> ig server sends the message and changes the map so client isn't able to get it in time 23:06 < bridge> i didn't even receive any message this time huh 23:06 < bridge> but "change map" is also a message 23:06 < bridge> if you send "chat message" and then "map change" 23:06 < bridge> then the client should receive it in that order 23:07 < bridge> When you have to delay the map change until all score workers jobs are done 23:08 < bridge> why? 23:08 < bridge> This doesn't seem to work because the message depends on whether the save failed, so you can't send the message first 23:08 < bridge> it doesn't really matter if the save fails or not. the save failing is there to respawn the tees IIRC 23:08 < bridge> no-no it sents it by default 23:08 < bridge> but that's not possible with a map change anyway 23:09 < bridge> ```cpp 23:09 < bridge> 23:09 < bridge> char aBuf[512]; 23:09 < bridge> if(Tmp->m_aCode[0] == '\0') 23:09 < bridge> { 23:09 < bridge> str_format(aBuf, 23:09 < bridge> sizeof(aBuf), 23:09 < bridge> "Team save in progress. You'll be able to load with '/load %s'", 23:09 < bridge> Tmp->m_aGeneratedCode); 23:09 < bridge> } 23:09 < bridge> else 23:09 < bridge> { 23:09 < bridge> str_format(aBuf, 23:09 < bridge> sizeof(aBuf), 23:09 < bridge> "Team save in progress. You'll be able to load with '/load %s' if save is successful or with '/load %s' if it fails", 23:09 < bridge> Tmp->m_aCode, 23:09 < bridge> Tmp->m_aGeneratedCode); 23:09 < bridge> } 23:09 < bridge> pController->Teams().KillSavedTeam(ClientID, Team); 23:09 < bridge> GameServer()->SendChatTeam(Team, aBuf);``` 23:10 < bridge> okey the only thing that client parses another message by default 23:10 < bridge> seems to be working 23:10 < bridge> sorry for me being that stupid xd 23:33 < bridge> nice, duplicated saves 23:33 < bridge> it parses both messages on regular save 23:34 < bridge> i will throw this parsing away and add new game packet 23:35 < bridge> but not today xd 23:35 < bridge> you could send different messages depending on the type of save 23:35 < bridge> (map change save vs regular save) 23:38 < bridge> thats what im doing 23:38 < bridge> client will parse both because it doesn't know did you receive previous save message or not 23:39 < bridge> btw my branch failed asan/ubsan somehow :P 23:39 < bridge> in teehistorian tests 23:39 < bridge> this really is not the worst idea 23:40 < bridge> ah no 23:40 < bridge> `Jobs.AbortAbortable` 23:41 < bridge> this will delay the map change almost indefinitely if the db stuff isn't working properly 23:42 < bridge> you could also not send the save code a second time in the map change save case ^^ 23:43 < bridge> i don't 23:43 < bridge> regular save will produce two messages 23:43 < bridge> first one with user code/generated code 23:43 < bridge> and second one with actual code registered in database 23:43 < bridge> oh. previously 23:43 < bridge> I see 23:43 < bridge> before your PR? 23:43 < bridge> ye 23:44 < bridge> and its good actually i just don't know how to get my save code on map change without something like client state bool that checks if you had these messages one by one 23:45 < bridge> thats why i want to add new game packet 23:45 < bridge> okey, thanks guys 23:45 < bridge> its nap time xd 23:46 < bridge> still curious about asan/ubsan check though