00:05 < bridge> z-team client (0.5.2) had it too xdddd 00:18 < bridge> finally purple 00:19 < bridge> Hello Devs 00:20 < bridge> helo Smlsd 00:25 < bridge> How can i create my own ddnet skin 00:25 < bridge> use an image editor 00:25 < bridge> are u familiar with photoshop/paint.net or smth like illustrator/inkscape 00:31 < bridge> Yes after? 00:31 < bridge> what 00:33 < bridge> Tell me how to make 00:37 < bridge> @mpft 00:38 < bridge> look at the default skin 00:38 < bridge> or find some template 00:38 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1242969865048821941/default.png?ex=664fc565&is=664e73e5&hm=d906cc69266fcdae01fd1727e17485868f5c5ae0b5b9102396f6672bd7c0b5ab& 00:38 < bridge> change it 00:39 < bridge> Ooooo 00:39 < bridge> Oke i understand 00:39 < bridge> I'm Gonna make myself 00:39 < bridge> Can everybody see when i send in #📬submit-skins ? 00:39 < bridge> Yes 00:39 < bridge> Elly? 00:39 < bridge> Really? 00:39 < bridge> YEEEY 00:40 < bridge> I'm Gonna make myself lik 00:40 < bridge> it's not guaranteed lol 00:40 < bridge> LoL 00:40 < bridge> people have to vote 00:40 < bridge> 😭 00:40 < bridge> and if your skin sucks then it won't be visible to others 00:40 < bridge> What votes 00:40 < bridge> Soo hmuch likes need 00:42 < bridge> #📍info 00:42 < bridge> @mpft what blue 00:43 < bridge> What means i didn't understand 00:43 < bridge> read the messages in the channel 00:43 < bridge> and please stop pinging me 00:44 < bridge> But it's not working dude 00:44 < bridge> I cant see any emojis 00:44 < bridge> Like ✅ 00:44 < bridge> #📬submit-skins 00:44 < bridge> Look 00:44 < bridge> Nothing have 00:46 < bridge> Ups sorry my bad 00:46 < bridge> I understand now 00:46 < bridge> 🙂 tu 00:46 < bridge> Ty 01:27 < bridge> this runs pretty well without gpu too in my experience 01:27 < bridge> but i have an 'ai power' cpu so xd 01:31 <+ws-client> if you need a free api checkout https://trans.zillyhuhn.com/ 01:43 < bridge> mmh very interesting service 01:43 < bridge> i think ill host one too 🙂 02:18 <+ws-client> the translations are a bit cursed tho :D 02:18 <+ws-client> but ye its super simple and light weight to self host 02:29 <+ws-client> @heinrich5991 i mean every feature I wanted is working now. But i still dont like the developer expirience. Now I have to annotate every function defintion and call with a #ifdef thingy 02:31 <+ws-client> https://zillyhuhn.com/cs/.1716424277.png 02:32 <+ws-client> I mean big ass functions with 10k lines are fun and then you only have to do that thing once. But I started to enjoy using more functions these days and then this would be unusabily bad to type. 02:33 <+ws-client> there has to be a way to find a function in an shared object that is also already defined in the main executable 03:00 <+ws-client> https://zillyhuhn.com/cs/.1716426013.png 03:00 <+ws-client> so this works .... 03:00 <+ws-client> but even i am scared of those macros 03:02 <+ws-client> I could replace function names in the final binary using some hexediting step at the end of the cmake pipeline xd 03:03 <+ws-client> that should work too. And then writing the code feels super smooht. No macros. 03:14 < bridge> What are you even making? 03:21 < bridge> With ifuncs anything is possible 04:30 <+ws-client> watafak is ifuncs 04:31 <+ws-client> i tried messing with linker scripts to rename my functions but that was no fun :( 04:33 <+ws-client> What i am working on is my developer expirience. I want to control tees on the server side. Like let them walk left or right. And those controls should be written in C. And i want them to get applied on compile without server reload. 04:33 <+ws-client> it all works now but only if i have all function names twice. because fakin dlsym does not look in my shared object if they are also statically linked into the server executable already 05:59 <+ws-client> Hmm interesting i managed to get dlsym work as i wanted it to. But outside of ddnet https://github.com/ChillerDragon/CompileTests/tree/6cb5015eeb0df128510c8c186491f6629816b800 but this one has all the features i want. Not sure how the ddnet code base is different from that. I mean ddnets cmakelists is huge who knowns which flags break rdynamic 06:37 < bridge> <0xdeen> @alex0006 Thank you! 06:41 < bridge> 🙃 08:22 < bridge> morning 08:27 < bridge> 🚂 08:30 < bridge> gm 09:03 < bridge> morning 09:13 < bridge> Morning Windows enjoyers and others 09:15 < bridge> Im a Windown Addict :monkalaugh: 09:19 < bridge> @ryozuki its my Birthday, am i now officially older than you? I forgot 09:21 < bridge> ye 09:21 < bridge> Happy Birthday! 🎂🎉🎁🎈🎊 10:20 <+ws-client> morning may kids and others 10:20 <+ws-client> @melon happy birthday. may kids are best, i also got older this month sadness 10:44 < bridge> https://discourse.llvm.org/t/rfc-building-llvm-for-webassembly/79073 10:45 < bridge> mine is on 29th 10:46 <+ws-client> @ryozuki +rep 10:47 < bridge> why u chat on irc now 10:47 < bridge> btw llvm on wasm can be pog 10:47 < bridge> better godbolt, rust wasm compiler, etc 10:47 <+ws-client> i always forget to refresh my login on mobile xd 10:48 <+ws-client> i cant access the pw from my mobile lmao 10:48 < bridge> and u can compile wasm on wasm host 10:48 <+ws-client> yeah would be funny 10:48 <+ws-client> wasm-ception 10:56 < bridge> Good morning, does anyone know, if the ddnet client has true command line arguments? I want to start the client in the editor directly with a map, something like 10:56 < bridge> `ddnet-client --map something.map` 10:56 <+ws-client> ./DDNet "mymap.map" should work or not? 10:58 < bridge> does it? If so thank you 👍 12:57 < bridge> HBD Melon senpai 🎉 15:06 < bridge> My favourite type of website. Just `error_generic` and `not_valid` doesn't say what the generic error is nor what is not valid on the form 15:06 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1243188398001225759/image.png?ex=665090eb&is=664f3f6b&hm=44760a3aa4c742de8029dbb91c9b5255b56facedac731d13978d2c82b4789ecb& 15:07 < bridge> Submitting the form again with no change immediately worked 15:10 < bridge> Which actually didn't work, but added my tax code to the db so now I can't try again as it shows me as registered but I didn't even finish registering 15:10 < bridge> thanks software 15:12 < bridge> but atleast the website looks cool with react and implemented using a flux pattern for state consistency 15:13 < bridge> turns out if you don't think out your logic properly, no amount of fancy patterns will save you 15:33 < bridge> thanks a lot 15:46 < bridge> :gigachad: 15:48 < bridge> I'm really enjoying the builtin testing framework in golang. It's just so easy to use, no thinking about what to use, how to configure it 15:49 < bridge> Just put tests in a file with suffix `_test.go` and name the functions with prefix `Test`, it even has builtin coverage, so you can just add `-cover` and it'll calculate coverage too while testing 15:50 < bridge> Also builtin support for benchmarks, and not the stupid kind, it modifies the iteration count until the result is statistically significant like `hyperfine` 15:51 < bridge> Parallel testing is also something you don't have to think about at all, if the test can run in parallel to others you just call `t.Parallel()` 15:52 < bridge> rust also has this kind of test support 🙂 15:52 < bridge> Is this Esperanto? 15:52 < bridge> no built-in test coverage though 15:52 <+ws-client> @AssassinTee ye the editor can open demo files and map names when you provide it as argument. It looks at the file extension. But breaks on spaces because it could also be a console command xd 15:53 < bridge> Rust was also quite enjoyable after C++ tbf 😄 15:53 <+ws-client> ``./DDNet "my map.map"`` runs the console command "my" and passes "map.map" as argument. 15:53 < bridge> https://en.cppreference.com/w/cpp/utility/tuple/tie 15:53 < bridge> c++ tuples 15:53 < bridge> xdd 15:53 < bridge> they cant add syntax sugar right 15:54 < bridge> its so ugly 15:56 < bridge> Mh, tuples are the least offensive part of modern C++ to me 15:56 <+ws-client> @Jupstar ✪ having an insecure password for chat.zillyhuhn.com is so pog! makes it such an accessible chat platform. 15:56 < bridge> Especially not tie. Look at how they interact with `std::get` though 15:56 < bridge> sum types are annoying in C++ 15:57 < bridge> and go, I assume 15:59 < bridge> Yeah not the most enjoyable things, in go for sum types you have to forgo type safety 16:00 < bridge> well mostly, sometimes you can get away with an interface that atleast keeps some information 16:03 < bridge> xd 16:03 < bridge> rust sum types are its power 16:03 < bridge> ADT 16:06 < bridge> Your best bet in C++ would be a tagged union or a std::variant, both have huge downsides as you know 16:11 <+ws-client> @chillerdragon true xDDD, i mean it's super secure, ngl 16:40 < bridge> How to reset the running time in the server code? 16:40 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1243211925513437225/image.png?ex=6650a6d4&is=664f5554&hm=ad2d47c99f32a819eaeaf771ebd52e457d2282977c291e1586679f7e0abde9df& 16:44 < bridge> https://dl.acm.org/doi/pdf/10.1145/356580.356581 16:44 < bridge> Von Neumann's First Computer Program 16:45 < bridge> ``` 16:45 < bridge> A third precaution: The notation used in 16:45 < bridge> this paper differs considerably from that 16:45 < bridge> used by von Neumann, so that modern 16:45 < bridge> readers can more easily understand what he 16:45 < bridge> did. Where he would write, for instance, 16:45 < bridge> 15) c -}- (m' -- 1)(p ~- 1) ~-~ 14 [ p ~- 2, 16:45 < bridge> we will use an equivalent assembly-like 16:45 < bridge> language form, 16:45 < bridge> MOVEIN PIK p~- 1, BUFFER, [YPTR]. 16:45 < bridge> ``` 16:45 < bridge> xd 16:47 < bridge> <ƤØŢĀŤ0Co> Isn't it in sql db? 16:50 < bridge> I have question, do you have a limitation on what can be passed to C? You don't seem to handle any of the complexity that comes from passing mixed class parameters 16:51 < bridge> can you give a example of mixed class parameters 16:52 < bridge> e.g. argument 1 is MEMORY class and argument 2 is INTEGER class 16:52 < bridge> Works for me on Windows, e.g. with `DDNet "data/maps/Sunny Side Up.map"` 16:52 < bridge> argument 1 should end up on stack, argument 2 should end up in rdi 16:54 < bridge> interesting. so if 1 is a large struct, then the first integer parameter will be in rdi? 16:54 < bridge> Yes, larger than 8 eightbytes to be exact for amd64 sysv 16:55 < bridge> Floats also break this btw, those need to go to xmm0 thru xmm7 16:55 < bridge> we have no floats 16:55 < bridge> i guess yeah we have a limitation 16:55 < bridge> class SSE to be more exact 16:57 < bridge> some stuff is passed by allocating it on the heap 16:58 < bridge> i think thats a way to avoid the complexity xd 16:58 < bridge> This way of passing basically only works as long as everything belongs to class integer 16:58 < bridge> yeah you could say the arguments that would be memory class are passed as a pointer 16:58 < bridge> So only pointers to aggregates 16:58 < bridge> ye 16:59 < bridge> Also be very careful with ints with bitsize larger than 64 17:00 < bridge> ```rust 17:00 < bridge> pub fn push_aligned(&mut self, align: usize, mut values: &[u64]) { 17:00 < bridge> assert!(align.is_power_of_two()); 17:00 < bridge> assert!(align <= 16); 17:00 < bridge> 17:00 < bridge> #[cfg(target_arch = "x86_64")] 17:00 < bridge> const NUM_REGISTER_ARGS: usize = 6; 17:00 < bridge> #[cfg(target_arch = "aarch64")] 17:00 < bridge> const NUM_REGISTER_ARGS: usize = 8; 17:00 < bridge> 17:00 < bridge> if align == 16 { 17:00 < bridge> // This works because on both aarch64 and x86_64 the stack is already aligned to 17:00 < bridge> // 16 bytes when the trampoline starts pushing values. 17:00 < bridge> 17:00 < bridge> // Whenever a value spans across multiple registers, if it's in a position where it would be split between 17:00 < bridge> // registers and the stack it must be padded so that the entire value is stored within the stack. 17:00 < bridge> if self.invoke_data.len() >= NUM_REGISTER_ARGS { 17:00 < bridge> if self.invoke_data.len() & 1 != 0 { 17:00 < bridge> self.invoke_data.push(0); 17:00 < bridge> } 17:00 < bridge> } else if self.invoke_data.len() + 1 >= NUM_REGISTER_ARGS { 17:00 < bridge> self.invoke_data.push(0); 17:00 < bridge> } else { 17:00 < bridge> let new_len = self.invoke_data.len() + values.len(); 17:00 < bridge> if new_len >= NUM_REGISTER_ARGS && new_len % 2 != 0 { 17:00 < bridge> let chunk; 17:00 < bridge> (chunk, values) = if values.len() >= 4 { 17:00 < bridge> values.split_at(4) 17:00 < bridge> } else { 17:00 < bridge> (values, [].as_slice()) 17:00 < bridge> }; 17:00 < bridge> you can access the time with m_Score on the player class. It's an std::optional so you can reset it with .reset() method. That may be wrong but at least it's what I did :p. 17:01 < bridge> It wont delete the time in the db though. 17:01 < bridge> 17:01 < bridge> You could also just delete the times directly in the db if you don't want them ig. 17:01 < bridge> I would honestly just ban anything larger than a register and only special case i128 if you need those 17:01 < bridge> thats what we do tbh 17:01 < bridge> the align 16 if branch is for u128 mainly 17:02 < bridge> a 64-byte struct is passed via registers? 17:02 < bridge> do you mean larger than 2 eightbytes? 17:03 < bridge> Unless I'm forgetting something, it should end up in registers 17:04 < bridge> Let me check again 17:05 < bridge> Is there any way to get the time of the race? 17:07 < bridge> Oh yeah, I forgot about the cleanup step, yes it's 2 20:00 < bridge> Thank you for the explanation! I have never seen it anywhere. I plan to integrate a button in the software I am currently creating, where you can start the ddnet client as check method 20:03 < bridge> Depends on your shell/OS I guess, it works on Windows with paths containing spaces. This is basically what happens when you double-click a .map file in the window explorer. 20:03 < bridge> Depends on your shell/OS I guess, it works on Windows with paths containing spaces. This is basically what happens when you double-click a .map file in the windows explorer. 20:03 < bridge> oh, the map suffix has other meanings, this doesn't work on my windows machine xD 20:03 < bridge> chillerdragon: https://www.twitch.tv/videos/2153217989 xd 20:04 < bridge> DDNet client should change the default editor though, unless you changed it back ^^ 20:05 < bridge> tested this, it asks me now which software I want to use 20:05 < bridge> ddnet ist the first choice 20:06 < bridge> yeah, that's Windows default behavior since 10, the user always needs to confirm the choice 20:06 < bridge> this has some nice implications, if you work on a map and want to start the editor quick, just link the map 20:11 < bridge> hello everyone! I wanted to clarify why it says "the server has not responded yet" on most of my servers 20:12 < bridge> bcs u are from ukraine and want to connec to russian servers 20:12 < bridge> bcs u are from ukraine and want to connect to russian servers 20:12 < bridge> thank you! 20:12 < bridge> yo jupjopjapstar 20:12 < bridge> yo 20:13 < bridge> jopjapjupstar 20:13 < bridge> clever 20:13 < bridge> chillerdragon is chillentano 20:13 < bridge> Oooooooh I'm Russian 20:13 < bridge> ok then russia seems to block traffic to outside of russia now 20:13 < bridge> my English is bad 20:13 < bridge> at least for your ISP 20:13 < bridge> which servers are inaccessible 20:14 < bridge> ips or names 20:14 < bridge> how are you jupstar 20:14 < bridge> all servers are from ddnet 20:15 < bridge> i'm fine, how are you zohan the best moderator that is 100% still moderator? 20:15 < bridge> are you sure? 20:15 < bridge> even RUS servers? 20:15 < bridge> :justatest: 20:15 < bridge> i have an access to all ddnet servers fifo but sshhh 20:15 < bridge> Yes 20:15 < bridge> mhh, u can try to restart your router 20:16 < bridge> has it ever worked for you? 20:16 < bridge> or are you a new player? 20:16 < bridge> I've already done it 20:16 < bridge> you can try a vpn 20:16 < bridge> then you know if it's related to this issue 20:17 < bridge> I do not know how to download vpn on pc😅 20:17 < bridge> I don't know of you'll get "sanctioned" if you try to do that 20:18 < bridge> because of the VPN? 20:18 < bridge> can you try to ping any server from your pc? 20:19 < bridge> And how is it? 20:19 < bridge> press win+R and write cmd.exe 20:20 < bridge> press enter and write "ping " in console 20:20 < bridge> and press enter one more time 20:20 < bridge> shouldn't also the domain work? master1.ddnet.org? 20:20 < bridge> or something like that 20:21 < bridge> i mean he sees the servers, so server list works 20:21 < bridge> maybe UDP is blocked 20:22 < bridge> issues 20:26 < bridge> jupsti was right 21:16 < bridge> @learath2 do u think its possible to do the assembly i gave u in C without inline asm? 21:19 < bridge> The trampoline thing? Surely it should be possible 21:19 < bridge> (With the restrictions we talked about) 21:25 < bridge> Actually no, what I was thinking of doesn't quite work 21:27 < bridge> remember it has a arbitrary num of args 21:27 < bridge> i would like to see it in pure c or rust 21:37 < bridge> I was thinking `__builtin_apply` but it's just too weak 21:49 < bridge> Btw something like libffi already has this stuff properly implemented if you’d like to take a look there 21:50 < bridge> oh 21:51 < bridge> (in assembly ofc, that’s the only proper way to do it, I was thinking of a way to trick the compiler into generating the assembly for you, which didn’t quite pan out) 21:57 < bridge> do the arguments are all the same size or can they be of different types ? 21:58 < bridge> He constrained it to the situation where we only have to handle amd64 sysv abi with only INTEGER class arguments 21:59 < bridge> Well aarch64 too but I think if you can get C or Rust code to generate correct assembly for one the other should also be free anyway 22:01 < bridge> then just a function with first parameter as int, then varargs should work 22:03 < bridge> Oh, you also start with just a pointer to the function, a pointer to an array of the args and the amount of args 22:04 < bridge> ye 22:04 < bridge> the trampoline builds the call 22:08 < bridge> There is a very jank way to do it, a switch statement over the arg count, and each branch has a call with 0 thru MAX_ARGCOUNT arguments 😄 22:10 < bridge> It won’t optimize properly at all I bet