00:02 < bridge> what do you mean by "entire thing"? 00:03 < bridge> the entire translation .txt, doesnt seem profitable to make a PR for a single translation :P 00:05 < bridge> why are you translating Tee again 00:05 < bridge> the players know what tees are 00:05 < bridge> just like they know what DDNet is 00:05 < bridge> Because I found the term that is used on Wiki 00:05 < bridge> i don't necessarily think this is the correct way to do that 00:06 < bridge> Having "тії" is better than having "тее", change my mind 00:07 < bridge> Tee is a identity, not something you translate 00:08 < bridge> translating `Tee` seems fine to me, but i'd consider `Tee` to be a proper noun, wouldnt really translate that 00:08 < bridge> but i'd consider `Tee` to be a proper noun, wouldnt really translate that 00:08 < bridge> "Combine" is also a proper noun, but it didn't stop translators 00:09 < bridge> that’s because it’s critical to the HL2 plot and wouldn’t make sense otherwise 00:09 < bridge> Slavic languages love transliterating proper nouns. Макдоналдс 00:09 < bridge> ^ 00:10 < bridge> i don’t think that makes it correct 00:10 < bridge> Старбакс 00:10 < bridge> harry potter is also transliterated in russian 00:10 < bridge> also, um, it is not finished yet. Again, 10 strings, and I don't know where they occur, meaning I can't really make an accurate translation 00:11 < bridge> And they use a г so it’s garry potter 00:11 < bridge> I wouldn't say it's garry potter 00:11 < bridge> are these the missing ones? 00:11 < bridge> just pronounced as such 00:11 < bridge> yes, those are the ones I haven't translated yet 00:13 < bridge> Well if a russian person only speaks russian, for all they know it might be garry everywhere 00:13 < bridge> I guess 00:13 < bridge> but it's also gitler, so it's a consistent transcription, at least 00:14 < bridge> I do wonder why leading h becomes g in russian though 00:14 < bridge> They do have the sounds for it х sounds much closer to my ear atleast 00:15 < bridge> probaly cuz russian developed without the "h" sound 00:15 < bridge> probaly cuz russian language developed without the "h" sound 00:20 < bridge> literally 10 strings (or 13, if including PRs, who knows), and the translation is done 00:21 < bridge> btw, should I try again adding context to "Name" in Server browser? 00:22 < bridge> oh wait it hasn't been fixed yet 00:23 < bridge> hasn't been fixed yet 00:23 < bridge> can someone try and reproduce crashing the client by rendering a demo, setting the playback time to 0.1 - forwarding a bit and then quitting out of it without finishing rendering using the X on the bottom right? - my client became unresponsive for a solid minute, outputted me this: 00:23 < bridge> 00:23 < bridge> ``` 00:23 < bridge> 2024-06-04 00:18:38 I demo_player: Stopped playback 00:23 < bridge> 2024-06-04 00:18:38 I demo_player: Loading demo 'demos/replays/asdasd.demo' 00:23 < bridge> 2024-06-04 00:18:38 I datafile: could not open 'maps/Adrenaline 3.map' 00:23 < bridge> 2024-06-04 00:18:38 I videorecorder: Recording to 'videos/asdasd.mp4.mp4' 00:23 < bridge> 2024-06-04 00:18:59 I client: disconnecting. reason='unknown' 00:23 < bridge> 2024-06-04 00:18:59 I video_recorder: ------------ 00:23 < bridge> 2024-06-04 00:18:59 I video_recorder: ------------ 00:23 < bridge> 2024-06-04 00:18:59 I demo_player: Stopped playback 00:23 < bridge> ``` 00:24 < bridge> 00:24 < bridge> and then closed (using DDNet 18.2) 00:24 < bridge> 00:24 < bridge> this is the output on latest upstream: 00:24 < bridge> 00:24 < bridge> ``` 00:24 < bridge> 2024-06-04 00:22:47 W videorecorder/libav: Too many bits 32768.000000 > 12288 per frame requested, clamping to max 00:24 < bridge> 00:24 < bridge> 2024-06-04 00:22:47 I videorecorder: Recording to 'videos/aseasdasdasd.mp4' 00:24 < bridge> 00:24 < bridge> 2024-06-04 00:22:51 I videorecorder/libav: frame I:114 Avg QP:14.91 size:177571 00:24 < bridge> 00:24 < bridge> 2024-06-04 00:22:51 I videorecorder/libav: frame P:412 Avg QP:24.00 size: 10011 00:24 < bridge> 00:24 < bridge> 2024-06-04 00:22:51 I videorecorder/libav: frame B:831 Avg QP:25.97 size: 3511 00:24 < bridge> 00:24 < bridge> 2024-06-04 00:22:51 I videorecorder/libav: consecutive B-frames: 12.7% 9.6% 22.3% 55.4% 00:24 < bridge> 00:24 < bridge> 2024-06-04 00:22:51 I videorecorder/libav: mb I I16..4: 32.8% 25.2% 41.9% 00:24 < bridge> dont know if its my fault or actual issue - so i didnt immediatly make one 00:26 < bridge> waiting then 00:26 < bridge> as well as for \#8404 00:28 < bridge> changing `Spectate` to `Spectating` means you have to change the string in every translation.txt file, so the PR is incomplete it seems? 00:28 < bridge> nvm deen already said something about it 00:28 < bridge> no, that cna be handled differently 00:58 < bridge> https://blog.rust-lang.org/2024/05/17/enabling-rust-lld-on-linux.html 00:58 < bridge> This feels very overdue 03:47 < bridge> maybe so but everyone i know who seriously uses rust on linux is linking with mold 03:48 < bridge> True, I'm using mold as well 08:29 < bridge> @nuborn @jupeyy_keks do have you got any good ideas for a net message struct that could replace NETMSG_INPUT when sending more than 1 input at once to save size? 08:29 < bridge> 08:29 < bridge> It seems that nearly 100% of the client's upload bandwidth is already from sending NETMSG_INPUT which makes 8441 pretty expensive in bandwidth. I was able to reduce it from 800 inputs per second maximum to 250 inputs per second maximum by assuming a minimum of 1/4 packets reach the server which gets it to reasonable bandwidth levels but it doesn't perform nearly as well above even 30% packet loss which makes me sad. 08:29 < bridge> 08:29 < bridge> Currently the client sends about 0.5KB/s-1.75KB/s of NETMSG_INPUT (without dummy), after the PR it's about 6KB-12KB/s. If I limit it to 250 inputs/s it gets down to 2.5KB/s-7KB/s which is more reasonable. The compression ratio on these seems to be around 1.5-1.7:1.0 08:29 < bridge> 08:29 < bridge> Other real time games seem to be in the 4-25KB/s range like CSGO/Overwatch/Valorant/Fornite. Those games of course probably already send duplicated inputs, but don't have a way for clients to manually adjust the "prediction margin", it would just be adjusted automatically based on network health so it would be much lower on average. DDNet client also attempts to adjust automatically but seems to fail very bad even in any scenario I tested, even with 08:29 < bridge> 08:29 < bridge> For the most part there's only 4 pieces of info that change in every individual NETMSG_INPUT which is m_AckGameTick, m_PredTick, m_TargetX, m_TargetY. The other things are limited to your human ability to press a button quickly which is pretty slow. 08:29 < bridge> 08:30 < bridge> It would be pretty easy to send m_AckGameTick, and m_PredTick only once for the entire message then increment them manually on the server for each contained input but not as easy for m_TargetX, m_TargetY. 08:30 < bridge> 08:30 < bridge> I have some doubts about how well a naive "binary diff" will work like Juppey suggested, it doesn't seem viable for such tiny sizes. ChatGPT suggested bit packing all the button presses into single bits then sending mouse deltas instead of mouse positions after the initial one, but I'm not sure that helps since the deltas also need to be full ints I think. Also we have m_Fire which is hogging 8 bits minimum. 08:32 < bridge> <0xdeen> > Currently the client sends about 0.5KB/s-1.75KB/s of NETMSG_INPUT (without dummy), after the PR it's about 6KB-12KB/s. If I limit it to 250 inputs/s it gets down to 2.5KB/s-7KB/s which is more reasonable. The compression ratio on these seems to be around 1.5-1.7:1.0 08:32 < bridge> <0xdeen> I'm afraid our servers might get overloaded with that 08:33 < bridge> well that's why I'm writing this message 08:33 < bridge> alternative would be just set a limit and accept whatever packet loss happens after that 08:34 < bridge> i dont understand why binary patching should not be the solution, isnt the input mostly the same for almost always? 08:35 < bridge> I don't understand how binary patching can define the patch positiona and the patch data in less bits than bitpacking+huffman 08:35 < bridge> I don't understand how binary patching can define the patch position and the patch data in less bits than bitpacking+huffman 08:35 < bridge> people on stackoverflow say it shouldn't be used like this 08:36 < bridge> but the bitpacking and huffman can be applied either way 08:36 < bridge> actually compression even must be applied 08:36 < bridge> surely there can be some solution though as this input duplication was invented by quakeworld in 1996 with like 1% of our current bandwidth 08:37 < bridge> surely there can be some solution though as this input duplication idea was invented by quakeworld in 1996 with like 1% of our current bandwidth 08:38 < bridge> give me the raw data for an input chain and we can compare which method wins 08:38 < bridge> i can write the binary patch part very quickly for it 08:38 < bridge> https://stackoverflow.com/questions/48871467/binary-diff-algorithm-for-small-binary-blobs 08:39 < bridge> idk 08:39 < bridge> well you have nothing to do, i'll do it 08:39 < bridge> wdym 08:40 < bridge> just give me the binary data of your packets 08:40 < bridge> and i'll try some stuff 08:40 < bridge> forgot about this one: https://github.com/ddnet/ddnet/pull/8423 08:40 < bridge> it only sends 1 packet per tick 08:40 < bridge> but it sends multiple packet chunks or whatever 08:41 < bridge> or just give me the 40 bytes of the inputs 08:41 < bridge> then tell me how tall that packet is on ddnet 08:41 < bridge> and i try to beat it 08:41 < bridge> it's not that simple 08:42 < bridge> give me the packets before the packer struct is used 08:42 < bridge> ok but what do you mean the packets 08:42 < bridge> before or after huffman 08:42 < bridge> before 08:42 < bridge> the raw input data basically, but ofc all 20 or how many u have 08:43 < bridge> ok 08:43 < bridge> then ddnet sends a single packet with all.. this size is interesting bcs that's what to beat (minus the packet header) 08:44 < bridge> why don't you just clone my PR and write it manually then measure the bandwidth used 08:44 < bridge> you can see outgoing bandwidth even if the server is ignoring your garbage packet data 08:44 < bridge> but i dunno what u did to measure this 08:45 < bridge> just system bandwidth usage 08:45 < bridge> I used some windows program utility 08:45 < bridge> https://www.netlimiter.com/ 08:45 < bridge> I used some windows utility program 08:46 < bridge> NETMSG_INPUT is like 99% of the realtime client upload bandwidth anyway so this is still accurate 08:47 < bridge> just system process bandwidth usage 08:50 < bridge> morning 08:56 < bridge> What issue does this 12x increase in traffic solve? 08:56 < bridge> <0xdeen> Sure, more expensive servers 08:57 < bridge> Or less players per server 08:58 < bridge> view at timestamp 08:58 < bridge> https://www.youtube.com/watch?v=W3aieHjyNvw&t=1891s 08:58 < bridge> https://private-user-images.githubusercontent.com/22122579/335931179-8c02bd20-fdc5-4d34-80d4-0a47ca8369da.mp4?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTc0ODQ1NjUsIm5iZiI6MTcxNzQ4NDI2NSwicGF0aCI6Ii8yMjEyMjU3OS8zMzU5MzExNzktOGMwMmJkMjAtZmRjNS00ZDM0LTgwZDQtMGE0N2NhODM2OWRhLm1wND9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09 08:58 < bridge> ok discord didn't like that 08:59 < bridge> There is a demo here: 08:59 < bridge> https://github.com/ddnet/ddnet/pull/8441 08:59 < bridge> <0xdeen> Isn't this dangerous? It means we trust the client more now and the client can manipulate the past? I'm wondering if this can give attackers an advantage to cheat 08:59 < bridge> no 09:00 < bridge> client cannot change inputs that it already sent to server after https://github.com/ddnet/ddnet/pull/8432 09:00 < bridge> no extra trust 09:01 < bridge> even if, it can only manipulate queued inputs.. so there isn't really an advantage that isnt there yet.. 09:01 < bridge> 09:01 < bridge> it could not change past inputs (in the sense that the logic already processed them) 09:02 < bridge> it has danger after #8372 09:02 < bridge> https://github.com/ddnet/ddnet/pull/8372 09:02 < bridge> but ddnet is not PvP so really it doesn't matter 09:02 < bridge> the client could already keep a local buffer of inputs if it really wanted 09:02 < bridge> you could play the entire map offline then play it back as a replay bot 09:03 < bridge> but even here, if one player does not use prediction margins, the other player doesnt really gain anything 09:03 < bridge> in PvP you could do something like trick your opponent into thinking you're in 1 position then you change your inputs on the server so you're actually in another position 09:03 < bridge> CS:GO has this vunerability and it is in cheats 09:04 < bridge> because they let the client modify inputs it already sent to the server buffer 09:04 < bridge> for some reason 09:04 < bridge> CS:GO had this vunerability and it is in cheats 09:05 < bridge> but still.. this only works if u use a reasonable high inputs queue in first place 09:05 < bridge> a _good_ client doesn't need a high prediction margin 09:05 < bridge> a cheating client doesn't care 09:05 < bridge> You can use less bytes for targetx and targety if their deltas are bounded. Similarly for ackgametick and predtick, you can only send deltas which are bounded 09:06 < bridge> so the cheating client sets a high prediction margin with low latency network basically? 09:06 < bridge> 09:06 < bridge> mh yeah that could work 09:06 < bridge> bounding the delta of targetx targety would be a change in client capabilities, is that ok? 09:06 < bridge> idk how you even enforce that 09:07 < bridge> Is it even physically possible to go faster than like 2 bytes at a time 09:07 < bridge> sometimes it is 09:07 < bridge> t0 player has spoken 09:07 < bridge> targetx targety is scaled by zoom so you can move abritrarily fast in the client already 09:07 < bridge> hmm, what about pvp mod hosters? 09:07 < bridge> not often 09:08 < bridge> Ah, that's a shame 09:08 < bridge> 🌞 09:08 < bridge> they will not receive this packet 09:08 < bridge> ddnet only 09:08 < bridge> Perhaps a magic delta value that indicates the next targetx and targety are not delta but full 09:08 < bridge> 0xFFFF 09:08 < bridge> also as I said there is no risk because the client cannot change values it already sent 09:09 < bridge> I see 09:10 < bridge> The rest of the input packet should compress very well though, do you do that yet? 09:10 < bridge> the compression performance of all packets is rather poor because the huffman table is 15 years old I think 09:10 < bridge> I only got like 1.5:1 09:11 < bridge> I would be quite surprised if that is an actual issue 09:11 < bridge> idk 09:11 < bridge> perhaps not 09:11 < bridge> 1.5:1 is not great either way 09:12 < bridge> But why rely on huffman anyway when we know the pattern already, the most common thing that will happen is that the input won't change. That's 1 bit you need to sneak in somewhere 09:13 < bridge> yes that's true, we can do better than huffman 09:13 < bridge> Why was huffman chosen in the first place? I think the nature of this kind of data makes it hard to compress 09:13 < bridge> huffman is just bonus 09:13 < bridge> ask magnus 09:13 < bridge> although I don't think it's a terrible choice 09:14 < bridge> it does better than nothing 09:14 < bridge> Exactly anything our naive but effective bit cant help with. Huffman can get a bit better 09:15 < bridge> there are instances where manually minimizing your data actually increases the overall size after compression because it has more entropy at the compressor, but I doubt this will be an issue for us because our huffman is very weak. 09:16 < bridge> turning duplicate bits into smaller non-duplicate bits makes compression worse 09:16 < bridge> sometimes 09:16 < bridge> Wherever structured data is involved, huffman coding usually works well-ish. It is also rather performant compared to alternatives 09:16 < bridge> What would you use? 09:17 < bridge> Can I get a short TL;DR why we are talking about minimizing data? 09:18 < bridge> we would like to sent duplicated input packets to minimize the lag that happens when packet loss occurs, but the total bandwidth is already 99% input packets so its important we minimize their size 09:18 < bridge> He wants to resend inputs that havent been acknowledged by the server yet 09:18 < bridge> we would like to send duplicated input packets to minimize the lag that happens when packet loss occurs, but the total bandwidth is already 99% input packets so its important we minimize their size 09:19 < bridge> Oh I see, have you tried it already? 09:19 < bridge> Or is everything theoretical? 09:19 < bridge> demo in here 09:19 < bridge> 09:19 < bridge> possibly this would also make DDoS less effective if we can make the inputs small enough 09:20 < bridge> Only a meager 12x increase in traffic 😄 09:20 < bridge> i doubt that, but it makes it less horrible for smaller lags 09:20 < bridge> Damn 09:20 < bridge> 12x is worst case if client is spamming their keyboard 09:20 < bridge> also it assumes you actively use prediction margins 09:20 < bridge> in theory the client should automatically adjust prediciton margin based on packet loss but this is a future issue 09:21 < bridge> yes but then the ddos pattern simply changes to 2 second massive attacks 09:21 < bridge> and then it doesnt work either wa 09:21 < bridge> and then it doesnt work either way 09:21 < bridge> Or worse because now our clients are also effectively ddosing us with inputs :thinkies: 09:21 < bridge> I doubt it 09:21 < bridge> How big is the rest of the input packet btw? 09:22 < bridge> wdym rest 09:22 < bridge> Except the 4 fields we already discussed 09:22 < bridge> 40bytes for input + the 12 bytes for 3 extra info ints 09:23 < bridge> What are in the extra info ints? Also slow changing stuff? 09:23 < bridge> m_AckGameTick, m_PredTick, m_Size 09:23 < bridge> m_Size is actually fixed at 40 and could maybe be deleted? 09:24 < bridge> its only incase we increase the size of the input struct 09:24 < bridge> I assume? 09:24 < bridge> Idk why it exists, been years since I last looked into input handling 09:24 < bridge> much of it is bad so it would not surprise me if we can remove it 09:25 < bridge> the client and server sent the input struct as abstract data which gets copied back into the actual struct later 09:25 < bridge> also I think the chance of use changing the input struct is pretty low 09:25 < bridge> also I think the chance of us changing the input struct is pretty low 09:27 < bridge> If we chunk the input packet into bytes (or twobytes). We can have two (or one) byte(s) whose bits can track whether their respective bytes (or twobytes) have changed. That would compress 40 bytes to 2-1 bytes in the common case that input doesn't change 09:27 < bridge> I would be interested in game tick negotiation, so we could run 100 tick servers instead of 50 09:27 < bridge> if DDoS is killing server performance then duplicate inputs would not help/make it worse, but if the DDoS is clogging network bandwidth then it would help a lot 09:27 < bridge> but i guess this will kill the physics, no? they are heavily coupled to the ticks 09:27 < bridge> this changes physics too much I think 09:27 < bridge> there was discussion and several prototypes on github 09:28 < bridge> <0xdeen> Absolutely 09:28 < bridge> it makes gores way easier :) 09:28 < bridge> Yeah 100ticks is a no go I think 09:28 < bridge> <0xdeen> You could have a way to allow it for new maps, but it might feel strange for players used to 50 ticks 09:29 < bridge> for gores it could work 09:29 < bridge> since it's not as bound to weird physics hacks 😄 09:29 < bridge> Anyone who implements it better have very concrete proof that if set at 50hz it still behaves the exact same as it used to 09:29 < bridge> we use sv_high_bandwidth on blockworlds, it might slightly change the physics but cosmetics are way smoother when it's enabled? 09:30 < bridge> we use sv_high_bandwidth on blockworlds, it might slightly change the physics but cosmetics are way smoother when it's enabled 09:30 < bridge> it does not change physics, just increases snapshot rate to clients 09:30 < bridge> 25->50 snaps/s 09:30 < bridge> Interesting 09:30 < bridge> When neural network based prediction? 09:30 < bridge> would be nice to have on offical servers 09:31 < bridge> Mhmmm, never tried before, but it could 09:31 < bridge> We would have to check and see how much more bandwidth it would use. Snapshots are delta compressed so it shouldnt be too too bad 09:31 < bridge> But I'd be in favor of negotiation in first place 😄 Not just setting the server to 100 ticks 09:31 < bridge> I assume its near double 09:31 < bridge> so instead of 50 ticks/sec it's 100 ticks/sec 09:32 < bridge> I would guess about 1.5x 09:32 < bridge> NO 09:32 < bridge> The state is snapshot more often. The state doesn't mutate more often. The tickrate refers to how quickly the state mutates 09:33 < bridge> it depends just because they are delta compressed doesn't mean it won't double it. Only if full snapshots stay the same and delta snapshots increase would it have less than 2x increase 09:33 < bridge> it depends, just because they are delta compressed doesn't mean it won't double it. Only if full snapshots stay the same and delta snapshots increase would it have less than 2x increase 09:33 < bridge> but if most of the bandwidth is already deltas then it will 2x 09:33 < bridge> since you can't get smaller than that 09:33 < bridge> Yeah would have to observe 09:33 < bridge> oh okay 09:34 < bridge> also it affects demo size 09:34 < bridge> on client PCs 09:34 < bridge> so all input packets are always the same size? 09:34 < bridge> can i assume that? 09:34 < bridge> yes 09:34 < bridge> nice 09:34 < bridge> that makes it even easier 09:34 < bridge> It appears more smooth because you get a snapshot about every tick. Instead of the default every other tick 09:34 < bridge> I guess this is true 09:35 < bridge> idk how much that helps but it does 09:35 < bridge> if sending more deltas means you send less deltas per tick it could be lower 09:35 < bridge> if sending more snaps means you send less deltas per tick it could be lower 09:36 < bridge> I was referring to Noa's message still 🙃 09:36 < bridge> ah right 09:36 < bridge> unintentially interesting idea tho xd 09:38 < bridge> Anyway, idk. I don't think we can guesstimate much since I actually don't remember how much of the traffic is deltas, but the sent deltas may or may not get smaller depending on whether we have things that change slower than 50hz faster than 25hz 09:39 < bridge> I think it should also reduce average latency by 20ms right? 09:40 < bridge> It should reduce it but I don't know why it would be by a flat number 09:40 < bridge> well on average 09:40 < bridge> at any given point in time there is between 0-40ms until the next snap the server sends you on 25tps 09:40 < bridge> at 50tps it's 0-20ms until the next one 09:41 < bridge> Ah, I see what you mean. Yeah that sounds about reasonable 09:43 < bridge> <0xfaulty> Increasing the speed of sending inputs would probably increase the accuracy of the antibot (at least my implementation), as often the change of inputs looks extremely strange, but in fact the reason for this is packet delays 09:43 < bridge> you're using client side antibot? 09:43 < bridge> <0xfaulty> server side ofc 09:43 < bridge> the server already recieves the full 50 inputs per second for every player. There can't be more than that unless you change the physics 09:44 < bridge> only clients are limited to 25hz 09:44 < bridge> only clients are limited to 25hz (for information about other players) 09:44 < bridge> <0xfaulty> This is in the perfect case, but in reality there are delays 09:44 < bridge> I guess sending it quicker wouldn't technically change the physics per se, but the feel 😄 09:45 < bridge> I'm not sure what you mean 09:45 < bridge> client side prediction ensures the feel is the same regardless of how fast your input reaches the server 09:45 < bridge> @totar so i have the binary diff now.. if u can now tell me how i can manually call compress from cpp code i can check how much better binary patching performs if i use ddnet's huffman compression 09:46 < bridge> @totar 's new patch would mean input packets would be less likely to be lost. Which would make your antibot get a more continuous appearing data stream. But you should probably be correcting for random transmission delays as those convey no information really 09:48 < bridge> I don't have some sort of compression testing framework for you to easily call a single function on the input data. You have to pack all the data for each input message (the 3 ints + player_input) into a single segment of memory, then add each segment of it to the message as an int. 09:48 < bridge> ok i'll just create a fake packet using the packer thing 09:48 < bridge> lets see if that works 09:48 < bridge> yeah exactly 09:48 < bridge> the packet can be garbage as far as the server knows 09:49 < bridge> you just need to make sure that whatever you put into the message can theoretically be converted back into the full data on the other side with all the information you give it 09:50 < bridge> <0xfaulty> You right, I meant continuity exactly, delays could be handled but missed data not 09:50 < bridge> this guy on reddit had an interesting idea 09:50 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1247457548127305779/image.png?ex=666018e0&is=665ec760&hm=5184633a944dbb3494b376f9fbd019b63b16e70ca8f1f3981afea5bcc03637ea& 09:50 < bridge> yeah since the input packets are same size that's super ez xd 09:51 < bridge> if you turn all the data into 0s then the generic compressor should make it really small 09:52 < bridge> There are many ways to compress slowly changing data 09:52 < bridge> less ways when it's only 52 bytes 09:54 < bridge> Well you can do exactly what he says and it would work fine, but I wouldn't really use something like lz4. Just rle 09:55 < bridge> Or you can do what I suggested with one or two bytes tracking the rest of the bytes 09:57 < bridge> I'm still a little dissapointed by the 1.5:1 by the huffman. like 80% of the input struct should always be zeros without any special tricks 09:57 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1247459146069053470/image.png?ex=66601a5d&is=665ec8dd&hm=6add5a0c3e4657f00d09809898a22610a26a232e1d27af756353807e9883ca52& 09:57 < bridge> I'm still a little dissapointed with the 1.5:1 by the huffman. like 80% of the input struct should always be zeros without any special tricks 09:57 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1247459146069053470/image.png?ex=66601a5d&is=665ec8dd&hm=6add5a0c3e4657f00d09809898a22610a26a232e1d27af756353807e9883ca52& 09:58 < bridge> so how can i identify my packet in wireshark now lmao 09:58 < bridge> wireshark is hard sorry lol 09:59 < bridge> look up some tutorials 09:59 < bridge> chiller would know it 09:59 < bridge> true 09:59 < bridge> Well the table is not for just inputs (I don't even know what the table is generated by/for). Huffman doesn't perform that well without seeing a lot of input 10:00 < bridge> I don't think the data to be comrpessed matters if the huffman table is fixed? 10:00 < bridge> I don't think the size of data to be comrpessed matters if the huffman table is fixed? 10:01 < bridge> We could have a huffman tree just for inputs and that might do better. It's have lots of sequences of zeros on short codes 10:01 < bridge> @totar i think the constant 136 bytes are my packet 10:01 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1247460095370199150/image.png?ex=66601b3f&is=665ec9bf&hm=461493dd51707345f9a07a67d8939a7d4ef5d48df0153bd9d2067fa666a2df3c& 10:01 < bridge> and the bigger ones are the normal resent packets 10:01 < bridge> I do not know how to use wireshark idk what you want from me lol 10:01 < bridge> 136bytes for 15 inputs? 10:01 < bridge> 13 inputs 10:01 < bridge> ok 10:01 < bridge> quite good I think right? 10:01 < bridge> i guess so 10:02 < bridge> hmm 10:02 < bridge> using brotli compression i get exactly the same lol 10:02 < bridge> actually that's 6.8KB/s 10:02 < bridge> I think 10:03 < bridge> which is still better than what I had at 13 inputs probably 10:03 < bridge> ah but it would loose if i'd add packet headers rip 10:03 < bridge> are you spinning your mouse in circles? 10:03 < bridge> that matters a lot 10:03 < bridge> yes 10:03 < bridge> ok 10:03 < bridge> i tried to jump and spin 10:03 < bridge> and move 10:03 < bridge> and press alt + f4 at the same time 10:03 < bridge> lmao 10:03 < bridge> lol 10:03 < bridge> Rq 10:04 < bridge> But how fast is yours vs brotli? 10:04 < bridge> the brotli part is only interesting bcs i wrote it in rust 10:04 < bridge> was just a test 10:05 < bridge> A lot of the big math smart guy optimizations don't kick in until sizes much larger than a couple hundred bytes 😛 10:05 < bridge> that's correct 10:05 < bridge> but i think for a general purpose compression that's still pretty good 10:05 < bridge> Yeah I think that's pretty good. How did you end up implementing it? 10:06 < bridge> also brotli is not designed for binary data actually lmao 10:06 < bridge> 136 bytes is about 5:1 which is the same as the amount of zeros to data in the orignal struct that I calculated a few minutes ago 10:06 < bridge> the binary patch? 10:06 < bridge> Yes 10:06 < bridge> very straight forward actually 10:06 < bridge> ```rust 10:06 < bridge> let mut writer = Vec::new(); 10:06 < bridge> let empty = vec![ 10:07 < bridge> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10:07 < bridge> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10:07 < bridge> ]; 10:07 < bridge> let mut cur_last = ∅ 10:07 < bridge> for a in a_bytearr.iter() { 10:07 < bridge> fn diff(old: &[u8], new: &[u8], writer: &mut Vec) { 10:07 < bridge> for (index, old) in old.iter().enumerate() { 10:07 < bridge> writer.push(new[index].wrapping_sub(*old)); 10:07 < bridge> } 10:07 < bridge> } 10:07 < bridge> diff(cur_last, a, &mut writer); 10:07 < bridge> cur_last = a; 10:07 < bridge> } 10:07 < bridge> ``` 10:07 < bridge> a_bytearr is simply the i32 converted to u8 10:07 < bridge> so for all input packets i simply create the binary diff towards the previous one 10:09 < bridge> I think I need my coffee and breakfast now. That looks like it encodes 40 bytes to 40 bytes diff 10:09 < bridge> it simply takes the difference 10:09 < bridge> thus creating lots of 0s 10:09 < bridge> that's the whole point of it 10:10 < bridge> and if not 0s then at least some smaller ints 10:10 < bridge> Ah, so you just let huffman coding take care of it 10:10 < bridge> yeah compression is applied nonethenless 10:11 < bridge> i basically just want to help the compressor a bit 10:11 < bridge> since inputs are always same size and always similar values 10:11 < bridge> I guess the longer sections of 0 are easier on the huffman table we have for some reason 10:11 < bridge> couldn't you just xor the previous input with the next one? 10:11 < bridge> like the guy on reddit said 10:12 < bridge> You can 10:12 < bridge> well nice 10:12 < bridge> but is xor even better? well i dunno 10:12 < bridge> my math brain is off rn 10:12 < bridge> I can't imagine how much it changes rn. Not before breakfast 10:12 < bridge> is this not equivalent to xor? 10:13 < bridge> if both are 40bytes the difference is actually just the xor? 10:13 < bridge> idk what your code does 10:13 < bridge> Bytewise sub 10:13 < bridge> hmm 10:13 < bridge> bitwise is better tho? 10:14 < bridge> or it needs bytewise? 10:14 < bridge> maybe int wise is even better than byte wise 10:14 < bridge> There is no bitwise sub :F 10:14 < bridge> since it doesnt destroy the whole int 10:14 < bridge> But bitwise xor of the entire thing is probably better than everything 10:14 < bridge> yes thats what I was thinking 10:14 < bridge> but anyway 10:15 < bridge> the idea is clear 10:15 < bridge> i'd try smth like that 10:15 < bridge> ok but 6.8KB/s is not acceptable yet I think 10:15 < bridge> on matter how good ur compression is.. context based information is just OP 10:15 < bridge> that's still 12x increase? 10:15 < bridge> no matter how good ur compression is.. context based information is just OP 10:15 < bridge> Well you'll need to set up a better way to test this and test a couple things 10:15 < bridge> really? wow, didnt know ddnet is so efficient upload wise 10:16 < bridge> the input is the ONLY upload 10:16 < bridge> lol 10:16 < bridge> @totar but even if u only pack the latest 5 inputs with a similar size it would already help 10:16 < bridge> 15 inputs is simply a lot 10:16 < bridge> Try the xor thing, try the delta compression I suggested, try xor followed by run length encoding 10:16 < bridge> you don't get the same packet loss protection charecteristics with a limit like that 10:16 < bridge> you don't get the same packet loss protection characteristics with a limit like that 10:17 < bridge> the overwatch guy said they send 15 inputs, he was also like "it compresses super well" without explaining how they do it xd 10:17 < bridge> If you are ambitious, try a new huffman table 10:17 < bridge> how do u even restore from xor? 10:17 < bridge> i dont understand anything 10:17 < bridge> ah right 10:17 < bridge> u know one side 10:17 < bridge> lmao 10:17 < bridge> Xor 10:18 < bridge> ok i do xor 10:18 < bridge> just for u 10:18 < bridge> I wonder if bitpacking+xor would be better 10:19 < bridge> less zeros is less data 10:19 < bridge> brotli already gets worse with xor xD 10:19 < bridge> Actually one issue, does this not make the packet loss tolerance 0? If somehow an input packet truly gets lost, how would you recover? 10:19 < bridge> now let me move it to cpp 10:19 < bridge> all the inputs are in the same packet 10:20 < bridge> oh 10:20 < bridge> And the window of inputs is always from the last acknowledged input seq? (Idk if we even keep track of that) 10:20 < bridge> no we won't do that 10:20 < bridge> just the size of prediction margin buffer 10:20 < bridge> 91 bytes 10:20 < bridge> :O 10:20 < bridge> that's significant 10:20 < bridge> so xor wins for huffman 10:21 < bridge> is this with the 3 extra info ints as well? 10:21 < bridge> or just 40 bytes of input 10:21 < bridge> thats the inner size of the UDP packet 10:21 < bridge> So if somehow a sequenced input gets lost from the head before it's processed by the server, how does the client recover? Can it recover? 10:22 < bridge> the inputs are only sequences within a single packet 10:22 < bridge> each packet can be processed without any others 10:22 < bridge> the inputs are only sequenced within a single packet 10:22 < bridge> you send redundent inputs incase one of the packets gets dropped the others have the same data, so the server can fill it in 10:22 < bridge> that's the whole idea 10:23 < bridge> Say we have a window of 3 inputs for simplicity. We have a, b, c. We send a packet with a, b, c. The nex packet will be b, c, d. If the first is lost. a is truly lost, no? 10:23 < bridge> Several demo rendering related crashes were fixed in nightly so it's likely this was already fixed and only happens in 18.2 and earlier if you can't reproduce it anymore 10:23 < bridge> Then applying the deltas, you can no longer get to a consistent state ever 10:24 < bridge> i was able to not reproduce the same behaviour, but i still got the client to freeze with latest upstream 10:24 < bridge> I don't understand what your concern is 10:24 < bridge> I think before we apply a resending patch like https://github.com/ddnet/ddnet/pull/8441, we should first figure out if packet loss like that is even a thing on ddnet servers 10:24 < bridge> it adds quite the complexity and as such should only be applied if it actually does something 10:24 < bridge> not just theoretically 10:24 < bridge> Previously since the input packet contained the entire thing, even if a couple were lost, you could always resync because well the entire thing is there 10:24 < bridge> I think it happens of course 10:24 < bridge> Please open an issue for that 10:24 < bridge> will do 10:24 < bridge> ask any gores player and they will tell you how many hundreds of times they die due to small lag 10:25 < bridge> yeah was about to say 10:25 < bridge> lets join KoG Turkey xd 10:25 < bridge> then I guess we should do the measurement on KoG turkey 10:25 < bridge> it's silly to say packet loss does not happen 10:26 < bridge> even if 1/10000 packets is dropped we have zero redundancy 10:26 < bridge> so it will always cause client desync 10:26 < bridge> why? AFAIK packet loss is rare on the actual internet 10:26 < bridge> packet delay is effectively the same 10:26 < bridge> but tbf, then it's about if u want to permanentely play with prediction margin 10:26 < bridge> 10:26 < bridge> Because otherwise it could never recover from it anyway 10:26 < bridge> even with automatic prediction margin not 10:27 < bridge> it cannot guess random laggs 10:27 < bridge> *drops 10:27 < bridge> I already mentioned it should adjust automatically 10:27 < bridge> but even then 10:27 < bridge> all these ideas are well documented and impliemented in multiplayer games for like 20 years 10:27 < bridge> how should it know the 10000th packet will drop 10:27 < bridge> I am not creating any ideas here 10:27 < bridge> that doesnt matter xD 10:27 < bridge> it simply makes no sense 10:27 < bridge> wdym 10:27 < bridge> I mean 1/10000 chance 10:27 < bridge> not every 1/10000 packets sequentailly 10:27 < bridge> This method does not guarantee a sequenced input will be never lost, unless it's coupled with server side acks and a window that grows infinitely. If you let the window slide, then you should make sure the entire packet is recoverable without needing the previous packet ever 10:28 < bridge> if u have a prediction margin of 1ms and the 10000th packet will drop, how do u want to handle that? 10:28 < bridge> how does the automatic prediction timer prepare for that? 10:28 < bridge> if you have a margin of 1ms you cannot do anything 10:28 < bridge> see, so you either have to accept to play with at least 20ms ALWAYS 10:28 < bridge> please watch the GDC talk I can't explain it as well as them 10:29 < bridge> or it doesnt really work anyway 😄 10:29 < bridge> but any kind of prediction margin always also means more input latency, which is totally ok for ddrace 10:29 < bridge> Is that not what you already do? The client is always ahead of the server 10:29 < bridge> the margin should increase automatically based on the server not acking your input when you expect 10:29 < bridge> i just want it to be clear 10:29 < bridge> without prediction margin of 20 or actually even 30 it's basically useless 10:29 < bridge> without mininmum* 10:29 < bridge> view https://github.com/ddnet/ddnet/pull/8372 10:30 < bridge> yes sure, but not if it's only every 10000th packet 10:30 < bridge> u can never guess that xD 10:30 < bridge> so a minimum prediction margin would be around 30ms 10:30 < bridge> sure 10:31 < bridge> yeah but only a bit 😄 10:31 < bridge> I'd guess it's not less than 20ms 10:31 < bridge> if you start dropping inputs don't you think it's better that you gain a little latency than you are no longer able to controll your tee? 10:31 < bridge> it's 10 10:31 < bridge> by default 10:32 < bridge> i'd say it's at least fair to say it's a change that is noticable 10:32 < bridge> I'd really like to see some data on this. if it is not actually happening like you say, then this patch doesn't do anything 10:32 < bridge> bcs antiping will "lag" more 10:32 < bridge> Huh, I remembered the default being 20 10:33 < bridge> the worlds best gores player could not solo a map on CHN servers 10:33 < bridge> you just have to press CTRL+SHIFT+D then CTRL+SHIFT+G and the ingame graph will show you your packet delays 10:34 < bridge> I guess the PR is not about improving european player's experience on chinese servers, is it? but yea, I agree that there is packet loss to china 10:34 < bridge> china has a very weird connection to the rest of the internet though, with the great firewall interfering and all 10:34 < bridge> what exactly do you want me to do to collect data 10:35 < bridge> will you say my ISP is specially bad compared to average 10:35 < bridge> write a small patch for the ddnet server that checks what inputs were missed 10:35 < bridge> the server can't know 10:35 < bridge> Dont we have sequence numbers on inputs? 10:35 < bridge> write a small patch for the ddnet server and client to see what inputs were missed 10:36 < bridge> client only sends input sometimes 10:36 < bridge> it assumes the server will reuse past input 10:36 < bridge> which btw makes packet drops worse 10:37 < bridge> the client already has the graph that shows you network issues 10:37 < bridge> just go join some servers and view it 10:38 < bridge> which of these graphs? they look pretty stable to me 10:38 < bridge> it's too early anyway 10:38 < bridge> the gametime graph shows me when I tab into ddnet 10:38 < bridge> 4 p.m. and turkey servers suck xddd 10:40 < bridge> It might be more useful during ddos too 10:40 < bridge> ddos is too heavy 10:40 < bridge> i doubt this patch really helps 10:40 < bridge> but why? if it's not bandwidth limited, why should packets be dropped? 10:41 < bridge> (and if it were bandwidth limited, this patch would make it worse) 10:41 < bridge> i dunno, i guess the bandwidth is kinda limited, whole europe then sends packets 10:41 < bridge> Turkey is connected to the backbone using fishing wire 10:41 < bridge> i mean it's probably about short spikes and rerouting etc. 10:42 < bridge> why would ddnet be immune to packet loss but other games routing over UDP are not? 10:43 < bridge> do you have something I can read about it? I'm not watching long videos 10:43 < bridge> do you have something where I can read about it? I'm not watching long videos 10:44 < bridge> do you have something where I can read about it? I'm not into watching long videos 10:44 < bridge> "The best servers in whole Europe are the USA ones" - Jupstar 10:46 < bridge> do you want evidence of packet loss or explanation of my PR 10:48 < bridge> Tbf there might not even be much written about it since it's such an obvious thing to do. They basically treat inputs as semi-vital 10:48 < bridge> people discuss sending duplicated input pretty often https://www.reddit.com/r/gamedev/comments/2f14s3/handling_packet_loss_in_a_clientserver_network/ck549s8/ 10:48 < bridge> packet loss 10:48 < bridge> @archimede67 Control find seems to highlight more then it should when searching for strings with cyrillic characters 10:49 < bridge> byte vs "char" count, probably? 10:50 < bridge> Is this not very tough to show? All teeworlds servers get some amount of ddos, how would you rule that out? My internet here is on some days shit, how would you rule that out? 10:50 < bridge> @archimede67 Control find (in the in-game console) seems to highlight more then it should when searching for strings with cyrillic characters 10:50 < bridge> by writing a small patch on the server, we can see how it affects actual players 10:50 < bridge> I mean if packet loss was extremely rare, tcp wouldn't really need to exist, nor would we need vital messages 10:51 < bridge> packet loss is rare AFAIK 10:51 < bridge> tcp does more things, e.g. congestion control 10:51 < bridge> packet loss goes up when you're close to saturating your connection 10:51 < bridge> But not rare enough to remove the vital delivery from our networking stack 10:53 < bridge> I don't remember how we do it but if we clear our backroom on ack, the size of the backroom on average might be a decent measure 10:53 < bridge> Though vital messages don't have nearly the same amount of "throughput" so maybe not great 10:53 < bridge> just because it's rare doesn't mean it doesn't matter 10:54 < bridge> under normal conditions it's rare but intermittent periods of instability are very common 10:54 < bridge> why not drop this discussion and get some actual data? 10:54 < bridge> Because it's not exactly trivial to get the data you want. The server can't know if it missed an input packet 10:55 < bridge> you can include a "previous input packet" number with each input on the client 10:55 < bridge> then the server will know that there was a missed one 10:56 < bridge> Well sure. I wouldn't mind merging that to see 10:57 < bridge> the design would probably look like this: server indicates that it wants to receive this extra data, client sends it with input packets, only if the server wanted to have it 11:00 < bridge> people have instability in their home network too, if you are playing on wifi from a laptop then simply being 50ft further away from your router will cause loss 11:00 < bridge> I think wifi does re-sends 11:01 < bridge> Wifi does do resends 11:02 < bridge> and this is also something that will be seen in these statistics 11:02 < bridge> they're end-to-end, I don't think they can miss anything 11:06 < bridge> just because it does resend doesn't mean it's adequate. The router needs to acknowledge that it did not receive the message, in which time the client could have already sent another packet with the previous data that gets sent immediately before the resend of the first packet happens 11:08 < bridge> Anyway, just from the fact that I know most other games are much more careful with their inputs that I will guess packet loss is more common than heinrich expects, but definitely not very common. I'll guess it affects about 1% of the players on a given day 11:09 < bridge> it affected me on 90%+ of days as a gores player 11:10 < bridge> go type "lag" into the discord search bar 11:11 < bridge> :justatest: 11:11 < bridge> Well sadly your experience is just anectodal evidence. You won't convince people with that 11:11 < bridge> ok what about deen? https://discord.com/channels/252358080522747904/293493549758939136/1220141243921596477 11:13 < bridge> I don't see what's wrong with gathering some statistics 11:13 < bridge> we'll be able to see what you say 11:13 < bridge> n=2 11:13 < bridge> there's nothing wrong with gathering statistics but you are denying a well documented problem 11:13 < bridge> It's extra mundane work that no one really wants to do 🙃 11:14 < bridge> also that 11:14 < bridge> Implementing cool new thing that requires you to think about cutting edge compression magic is fun 11:14 < bridge> Adding a grafana hook or sth to a sequence number, not so much 11:14 < bridge> it sounds good to know the benefit if we duplicate our traffic for it 11:15 < bridge> I agree though. We should do it properly, log it and see how prevalent it is 11:16 < bridge> If its more like 1 in a thousand it just might not be worth (in the best case) increasing our traffic even 3x 11:16 < bridge> how do you quantify the impact it has on the player experience 11:18 < bridge> Post game survey on people that experienced packet loss 😛 idk it's not easy to measure something so abstract as "impact on player experience" 11:18 < bridge> you can get the survey if you put lag in the search bar 🙂 11:18 < bridge> I didn't want ot measure the player experience, but the packet loss 11:19 < bridge> ok I think I am done with this discussion today 11:21 < bridge> Can you open an issue with an example? 11:21 < bridge> if the patch improves the player experience by sending an input that is otherwise delayed (even if not dropped) too far that would still be a win 11:21 < bridge> I can, later this evening 11:21 < bridge> Alright, thanks! 11:54 < bridge> are there any frontend (react) devs here? 11:54 < bridge> need some help and im willing to pay 100€ for ~1hr of work 11:55 < bridge> if u just post your question i might be able to help 11:59 < bridge> there is no question, im just a dumbass who has a deadline to hold, but I do not know shit about JS 12:00 < bridge> lmao 12:00 < bridge> https://dontasktoask.com/ 12:00 < bridge> ``` 12:00 < bridge> Every now and then, in online chat rooms I hang around in, someone pops in and says something in the lines of, 12:00 < bridge> 12:00 < bridge> Foobar123:Any Java experts around? 12:00 < bridge> This is bad form, for several reasons. What the person is actually asking here is, 12:00 < bridge> ``` 12:00 < bridge> 12:00 < bridge> :P 12:00 < bridge> ``` 12:00 < bridge> Every now and then, in online chat rooms I hang around in, someone pops in and says something in the lines of, 12:01 < bridge> 12:01 < bridge> Foobar123:Any Java experts around? 12:01 < bridge> This is bad form, for several reasons. What the person is actually asking here is 12:01 < bridge> 12:01 < bridge> Foobar123:Any Java experts around who are willing to commit into looking into my problem, whatever that may turn out to be, even if it's not actually related to Java or if someone who doesn't know anything about Java could actually answer my question? 12:01 < bridge> ``` 12:01 < bridge> 12:01 < bridge> :P 12:01 < bridge> basically I have a JS lib with react 16 with a desired design, and another one with an old design. 12:01 < bridge> he wants someone to do his homework xD 12:01 < bridge> frontend.. freddie maybe? XD 12:01 < bridge> if this was homework I was hardly offering 100 clams 12:01 < bridge> i indeed know react xdd 12:01 < bridge> and I can't break API 12:02 < bridge> Have you tried outsourcing it to chatgpt? 12:02 < bridge> use phind 12:02 < bridge> use phind, easier to track down the sources it fetches stuff from 12:05 < bridge> in rust we trust 12:06 < bridge> When will you migrate to edlang? 12:10 < bridge> Hahaha lol maybe don't send this to this guy 12:13 < bridge> when its somewhat usable xd 12:17 < bridge> get that bag 💰 12:29 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1247497438386851850/archlinux.gif?ex=66603e06&is=665eec86&hm=3d5662cb2ef881c7e4968f716053a00b2bed47fef30ae6d5aad913eca0af845f& 12:29 < bridge> you guys are mean 12:30 < bridge> I'll just donate the money and work the night 12:30 < bridge> and then proceed to cry myself to sleep 12:37 < bridge> @gutzufusss: is the code public? So what is the task? Copy pasting a design from one react version to another? 12:39 < bridge> basically, yes. with the twist of keeping the new library's API (as much as possible) intact 12:39 < bridge> code is not public 12:39 < bridge> and I cannot share, that would be a teamviewer session xd 12:39 < bridge> Yikes sorry I’m out 12:53 < bridge> though so, if i need some whitespaces removed i will @ you ❤️ 12:55 < bridge> i would not take that ChillerDragon 12:55 < bridge> me personally 13:03 < bridge> why? i used the heart emoji 13:38 < bridge> Switching from x11 to wayland, *tripled* my fps Oo. Anyone with similar experiences? 13:46 < bridge> i peaked my FPS to 21K on wayland, peaked at 16K on x11 iirc - so yea :P 13:48 < bridge> well, it's the difference between <200 and >600 here ^^ 13:48 < bridge> I don't need 21k, I'm not a pro :p 14:06 < bridge> So, you don't play on GNOME? 14:09 < bridge> bah 14:13 < bridge> GNOME best for gaming 14:21 < bridge> I switched to Wayland once but had a rather bad experience so I'll try again once it is a little more polished :D 14:33 < bridge> not tripple but i also observed small increase 😄 14:33 < bridge> other than that i can only say what teero said xD 14:34 < bridge> rather bad experience yet 14:45 < bridge> well, it doesn't configure faster than awesome ^^ 15:30 < bridge> hi gentooers 15:57 < bridge> https://mathstodon.xyz/@tao/112557248794707738 16:15 < bridge> Pasting a 6 digit hex code into the editor color hex should append FF on the end, not 00 at the front 16:16 < bridge> bahah nice one 16:47 < bridge> This post was fact-checked by true Liberland patriots 18:17 < bridge> You mean into the hex color text box? It should work like you want already, when you paste with Shift+Left click directly on the color picker, which should also be faster (Shift+right click copies the color as RGBA, but you can paste RGB or RGBA correctly). 19:47 < bridge> So, this is the list of strings I couldn't translate, some because I don't know where they occure, and some because I don't know technical terms behind them 19:47 < bridge> 19:47 < bridge> ``` 19:47 < bridge> (paused) 19:47 < bridge> All combined 19:47 < bridge> Folder Link 19:47 < bridge> Follow 19:47 < bridge> Game paused 19:47 < bridge> Grabs 19:48 < bridge> Moved ingame 19:48 < bridge> Replace video 19:48 < bridge> Searching 19:48 < bridge> 19:48 < bridge> [Graphics error] 19:48 < bridge> An error during command recording occurred. Try to update your GPU drivers. 19:48 < bridge> ``` 19:48 < bridge> Only those 10 and that's all... anyone? 19:48 < bridge> Only those 10 left and that's all... anyone? 19:59 < bridge> game paused appear when ingame match gets paused :P 19:59 < bridge> follow is about following player in spectator mode 20:00 < bridge> grabs are grabs of flag in ctf like mods 20:00 < bridge> > (paused) 20:00 < bridge> 20:00 < bridge> Shown in demo render popup when the demo player should initially start paused. 20:00 < bridge> 20:00 < bridge> > All combined 20:00 < bridge> 20:00 < bridge> Show for a Folder Link in the demo browser that represented all storage locations combined. Easiest way to get this is to create a folder `demos` inside your `data` folder. Then you can navigate up another folder with `../` in the demo browser. 20:00 < bridge> 20:00 < bridge> > Folder Link 20:00 < bridge> 20:00 < bridge> See above. This is shown for folders on the root level in the demo browser when multiple `demos` folders exist. 20:00 < bridge> 20:00 < bridge> > Follow 20:00 < bridge> 20:00 < bridge> Shown in the spectator menu during demo playback. Represents the default spectation target for which the demo was recorded. 20:00 < bridge> 20:00 < bridge> > Game paused 20:00 < bridge> 20:00 < bridge> Part of the HUD when the game is paused. Use `pause` in the rcon of a local server. 20:00 < bridge> 20:01 < bridge> > Grabs 20:01 < bridge> 20:01 < bridge> Represents the number of times the enemy flag was grabbed in CTF, i.e. touched without necessarily being captured. 20:01 < bridge> 20:01 < bridge> > Moved ingame 20:01 < bridge> 20:01 < bridge> Shown in the editor when your character was moved ingame. While in a server, jump then quickly open the editor with Ctrl+Shift+E to see this. 20:01 < bridge> 20:01 < bridge> > Replace video 20:01 < bridge> 20:01 < bridge> Shown in a popup when the video file (mp4) you are trying to render to already exists. 20:01 < bridge> heg Robyt3 20:01 < bridge> hey Robyt3 20:10 < bridge> hey Robyt33 20:10 < bridge> rather bad experience ye 20:10 < bridge> hey Robyt3 20:13 < bridge> hey 20:15 < bridge> morning linux enjoyers and others 20:16 < bridge> morning leetcode.com enjoyer - its 8PM - did you just wake up? 20:16 < bridge> no i didn't and its 9pm 20:18 < bridge> uk? portugal?https://upload.wikimedia.org/wikipedia/commons/8/88/World_Time_Zones_Map.png 20:26 < bridge> hm? 20:27 < bridge> its 1 ahead of UTC+1 (summertime UTC+2) so it has to be madagascar! 20:27 < bridge> @milkeeycat get leaked 20:28 < bridge> It's Ukraine 😏 20:28 < bridge> @milkeeycat get leaked 20:29 < bridge> woops, wrong direction 20:40 < bridge> Still can't find "Follow", will be grateful for a screenshot or something alike 20:40 < bridge> Also, what is "command recording"? 20:42 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1247621479093502093/screenshot_2024-06-04_20-42-03.png?ex=6660b18c&is=665f600c&hm=861bf3e512b26aa866e2f9d391acd647666dc28072dd56bead0091ad97d44998& 20:43 < bridge> follow what 20:43 < bridge> ! 20:44 < bridge> Follow the camera that was recorded in the demo 20:44 < bridge> oh 20:44 < bridge> can we have specvoted inside that menu ingame 20:45 < bridge> "command recording failed" means either https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkBeginCommandBuffer.html or https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkEndCommandBuffer.html failed, that's all I know 20:50 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1247623618058522664/bded06685691120f.png?ex=6660b38a&is=665f620a&hm=922764971044c5faffd46fa7453ce5752c9491adf0c7fb149c2e2f32072f125c& 20:50 < bridge> The end? 20:50 < bridge> The End? 20:55 < bridge> egyt next robyt fr 20:57 < bridge> ??? 21:05 < bridge> "egyt is the next contributor who contributes as much as @robyt3" 21:05 < bridge> "egyt is the next contributor who contributes as much as @robyt3, for real!" 21:05 < bridge> LaTeX is pretty good for writing letters too. I have pretty much migrated all my writing and design over to latex and it has been really enjoyable. I would recommend to anyone who doesn't feel like using a word processor. Much better for the programatically minded 😛 21:06 < bridge> it has the nice side effect of being versionable 21:06 < bridge> however, I feel there's a better language than latex that hasn't been developed yet 21:06 < bridge> 10000% 21:07 < bridge> LaTeX is HARD to use 21:07 < bridge> For simple things it's not too bad, but as soon as you do anything that involves being more concrete about positioning stuff it gets really hard 21:08 < bridge> Perhaps HTML+CSS is that language now that I think about it, but idk it feels overkill 21:08 < bridge> And then there are individual packages like TikZ that are probably as complex as LaTeX itself :justatest: 21:09 < bridge> I used some tikz to decorate my CV (more like fill up some space so it doesn't look too empty) 😄 21:09 < bridge> Hehe, I hope I don't cause problems 21:10 < bridge> I also used it to draw some system diagrams for my control theory course, but it is far too slow to take notes on the go with it, so I started just drawing it by hand in excalidraw and putting a screenshot in my notes instead 21:10 < bridge> s\/slow/verbose/ 21:11 < bridge> I think that was meant positively 21:11 < bridge> I'll also add "Tee" (\#8444) and "%d/%d KiB (%.1f KiB/s)" (\#8423), so I don't have to add them later 21:12 < bridge> sounds good 21:12 < bridge> soon™️ 21:12 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1247629017507696793/image.png?ex=6660b891&is=665f6711&hm=92d49c1e1a5c88b94da464bc30b58ea17ca96673454c9832d567f76df9b1dea4& 21:12 < bridge> soon™️ (im such a paint pro) 21:12 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1247629017507696793/image.png?ex=6660b891&is=665f6711&hm=92d49c1e1a5c88b94da464bc30b58ea17ca96673454c9832d567f76df9b1dea4& 21:12 < bridge> Whyn't Krita? 21:13 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1247629201465671800/emoji-emoji-disintegrating.gif?ex=6660b8bd&is=665f673d&hm=991877a88df018299c6f26ad7dba8b129e0e88d462c1f2cc10ac7cc1c8333b17& 21:13 < bridge> i dont like krita for image manipulation - only for drawing if i'm bored :justatest: 21:14 < bridge> flameshot!! 21:14 < bridge> i drifted out of latex a lil bit, because it's a freaking pain to make slides and courses with it... 21:15 < bridge> So you are back to powerpoint or whatever libreoffice equivalent? 21:15 < bridge> lemme introduce you to typst that is rust based: 21:15 < bridge> https://github.com/typst/typst 21:15 < bridge> libreoffice impress for now 21:15 < bridge> ah right, I've seen that before. haven't checked it out yet 21:15 < bridge> i might redo the slides in latex later though 21:16 < bridge> This looks so cool 21:16 < bridge> If you make a template, then stick to it, it's not too too bad, but I do understand why you might not want to bother 21:17 < bridge> oh my god i could use this for my school assignments - this looks great :o 21:17 < bridge> the problem of latex is that you have to use it everyday, otherwise you struggle with it 21:17 < bridge> My biggest issues have been tables and system drawings. `tabularx` has helped a lot with tables 21:17 < bridge> and given that i have long periods where i don't use it, i just forget everything 21:17 < bridge> Aha, you put it into better words than I ever could. I cool down off of latex very quickly aswell. It's an unintuitive and easy to forget syntax 21:17 < bridge> i should probably have a file with every tricks i used at some point with some keyword to search for 21:18 < bridge> typst looks much better though, atleast in that aspect 21:18 < bridge> And why my GIF got deleted? 21:18 < bridge> it was using so much vertical space for little content 21:19 < bridge> It was fine on my side 👀 21:23 < bridge> So, now I check if I ordered everything in alphabetical order... 21:26 < bridge> don't! 21:26 < bridge> there's a script that does that 21:29 < bridge> Will Still :^) 21:30 < bridge> Maybe I'll catch some mistakes on the way 21:30 < bridge> f3 21:30 < bridge> my bud uses it for lectures instead of latex 21:30 < bridge> x100 speed up 21:31 < bridge> i've never used it or even looked it up, but a colleague tried it this year 21:31 < bridge> i wonder if it's possible to do some drawing with it 21:38 < bridge> typst is super easy to use aswell :o 21:38 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1247635591391219874/image.png?ex=6660beb0&is=665f6d30&hm=bff25593acddf4e0e35e85141618d581c44b438aa1ad527b718d965b5568788b& 21:38 < bridge> lets see if i can actually do something cool with it :kek: 21:38 < bridge> heard of AsciiDoc? 21:39 < bridge> Imagine if Esperanto words were able to be THAT long! 21:39 < bridge> ***i dont care about Esperanto*** :justatest: 21:44 < bridge> is it easy to align cells though ? in latex, it's a pain in the ass 21:45 < bridge> their documentation is quite good, lets see 21:45 < bridge> give me like 10 minutes to play around with it :D 21:45 < bridge> can you align all vertically to the heighest (rightmost) cell ? 21:56 < bridge> might take longer than expected - a lot of stuff to read 22:04 < bridge> didnt really check with grid and cell allignment yet, but their general text allignment is pretty straight forward - will test with grids soon aswell 22:04 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1247642110224760832/image.png?ex=6660c4c3&is=665f7343&hm=df11a5e3f9412e44040fdafc43ed12541d9172562d216531f86a66150431764c& 22:04 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1247642110518235197/image.png?ex=6660c4c3&is=665f7343&hm=b8efbb9275f12bb15c3d5001f534309737426a7bf503c7a2713f87adb273c713& 22:24 < bridge> sorry to disturb you, are there any known bugs about maps crashing the client? like map size too big or anything? its about a 2000x125 map 22:25 < bridge> yes 22:26 < bridge> last time I fuzzed the format I stopped after around 20000 crashes 😄 22:27 < bridge> 2000x125 shouldn't be too large though 22:27 < bridge> unless you have a lot of layers 22:28 < bridge> do quads matter? 22:28 < bridge> if you use Windows, you should get a crash log in the `dumps` folder that would help debug this 22:29 < bridge> there are some layers of opacity here, hmm 22:29 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1247648323679027291/screenshot_2024-06-04_22-28-21.png?ex=6660ca8c&is=665f790c&hm=419e427dbf5dae86f4db171b511a066236c035f600bf46e9799f7e6f70357025& 22:29 < bridge> I'm not aware of crashes with quads if you only use the client tool to edit the map 22:29 < bridge> Crash log would be useful 22:29 < bridge> Or send the map 22:31 < bridge> MY PR GOT A PALINDROME NUMBER 22:32 < bridge> MY PR GOT A PALINDROME NUMBER 🤯 22:32 < bridge> https://discord.com/channels/252358080522747904/1247553741629165569/1247579987016552468 22:33 < bridge> ye im asking for a friend, he is reading 😅 22:34 < bridge> egyt did you run a script to sort your file? it seems to be completly off :o 22:36 < bridge> scripts for those who have skill issues, real chads do everything by hand 22:36 < bridge> I didn't 👀 22:37 < bridge> https://github.com/ddnet/ddnet/tree/master/scripts/languages 22:37 < bridge> 22:37 < bridge> there are some scripts for language files in here 22:37 < bridge> may I edit your PR to sort the file so that the diff is better? 22:37 < bridge> Why are you even asking? 22:38 < bridge> :P 22:38 < bridge> dunno, maybe you want to do it yourself 22:38 < bridge> Doesn't crash for me on Windows with Vulkan/OpenGL, please send crash log if you/they have one 22:38 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1247650821500309598/crash.txt?ex=6660cce0&is=665f7b60&hm=fe6dbddb45a8eae8cf1ed375007cfa471f23dbc17be9c8281467cb2c5f5bb23d& 22:38 < bridge> Well, will that break my alphabetical order? 22:39 < bridge> Do you have an `.RTP` file? 22:39 < bridge> nah 22:39 < bridge> :feelsbadman: 22:39 < bridge> it will break the order you currently have, yes 22:40 < bridge> Does it crash consistently? Maybe you could run with a debugger attached to get a stack trace 22:40 < bridge> its crashing when initalizing map logic 22:41 < bridge> okay, if it is that necesary :^( 22:41 < bridge> was sorting it for so long 22:41 < bridge> not really necessary, but it will clean up the shown diff and keep its style with other translation files :P 22:41 < bridge> I told you not to 😦 22:42 < bridge> it's necessary in the end, since the script will do that on the next translation update otherwise 22:42 < bridge> true 22:42 < bridge> I was sorting it from the start, just so you know 22:42 < bridge> thats some serious dedication 22:43 < bridge> sorry 😦 22:43 < bridge> heinrich literally said that there's a script for that and yet you decided to do it yourself 22:43 < bridge> well, it was also comfortable to me, so I could see which strings I have translated and which not 22:43 < bridge> @milkeeycat ^ 22:47 < bridge> https://tenor.com/view/itve-hl2-half-life-in-the-end-itve23-gif-26249031 22:58 < bridge> yo robyt3 we are doing experiments, i deleted almost all layers and the music, now it doesnt crash - hmm gotta test alot for more info 23:03 < bridge> I tried on Ubuntu but it also doesn't crash there for me. Please let me know if you narrowed it down further and send a minimal map that causes the crash 23:03 < bridge> i removed the music and now it works, lol 23:06 < bridge> yep we switched back and forth between with music and without music versions, lucky guess, basically the first thing i tried 😅 23:07 < bridge> Can you try to create a map with only the music that still crashes? 23:13 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1247659438798536704/screenshot_2024-06-04_23-12-41.png?ex=6660d4e6&is=665f8366&hm=0704186ee2b3ef2b07b178665e76c5c691e988c895be2adb6ffb60cff8efeb54& 23:13 < bridge> it still crashes on that 23:13 < bridge> sorry for the name 😅 23:13 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1247659559711936542/Shkyylkillermap.map?ex=6660d503&is=665f8383&hm=bb73796432e860699de193f748085746971fb157e874da1e94488c32ffde874d& 23:14 < bridge> do you need more tests? like testing the music files individually? 23:14 < bridge> If you have the time, yeah, I can't reproduce the crash unfortunately 23:18 < bridge> this is the bugged music 23:18 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1247660847095091252/Shkyylkillermap_magichesky.map?ex=6660d636&is=665f84b6&hm=e9469699d77852b923b0a2c9ca65df7befa7506a9cbb723e58b76a2abfea10f8& 23:18 < bridge> cool sounds but it doesnt crash for me either 23:19 < bridge> yeah it works for most of us 23:19 < bridge> only one player has those issues yet (or only one mentioned issues) 23:19 < bridge> only one player had those issues yet (or only one mentioned issues) 23:19 < bridge> :signs: 23:21 < bridge> -> also did the reverse test, with only that file removed, shkyyl was able to join 23:24 < bridge> Are you using the Steam version or from https://ddnet.org/downloads/ ? You could try the other to see if that changes anything 23:25 < bridge> Ah, yeah, log says Steam 23:25 < bridge> i'm playing on steam version 23:25 < bridge> yeah but i tested from the ddnet.org too 23:25 < bridge> stupid bug froze my entire computer 23:27 < bridge> just an addition, it even crashes with the "use sound" checkbox disabled 23:29 < bridge> Wonderful said he downloaded sound from internet and converted it to opus through convertio, same converter he used for other sounds 23:31 < bridge> can he - for quick measure just use another converter? 23:31 < bridge> 23:31 < bridge> we usually recommend this one: 23:31 < bridge> 23:31 < bridge> https://audio.online-convert.com/convert-to-opus 23:32 < bridge> can he - for quick measure just use another converter? 23:32 < bridge> 23:32 < bridge> for example this one: 23:32 < bridge> 23:32 < bridge> https://audio.online-convert.com/convert-to-opus 23:32 < bridge> should just downlaod wavpack 23:35 < bridge> Probably because he didn't restart the client after changing the "use sound" setting, I don't think it should try to load the sound at all otherwise 23:38 < bridge> the mapper uploaded a new version, i think they used the converter mentioned and now it seems to work 23:38 < bridge> <♂S1mple♂> ban convertio fr 23:39 < bridge> the mapper uploaded a new version, i think they used the converter mentioned (not sure on that) and now it seems to work 23:39 < bridge> the mapper uploaded a new version, they used the converter mentioned and now it seems to work 23:41 < bridge> should still not crash using convert.io 23:42 < bridge> <♂S1mple♂> well, he used convertio.co 23:42 < bridge> or convertio.co 23:43 < bridge> (or any converter) 23:43 < bridge> <♂S1mple♂> idk how it works but using another converter for this exact sound worked 23:44 < bridge> The sound also works on Windows, but it shouldn't crash for anyone with any sound 23:44 < bridge> The sound also works on Windows (and my Ubuntu), but it shouldn't crash for anyone with any sound