10:23 < bridge> yooo the icon changed back to default 10:23 < bridge> it looks like a cookie with feet 10:25 < bridge> chiller are you there 10:26 < bridge> speaking into the void 10:26 < bridge> i hate it 10:27 < bridge> feels like going a cave and yelling 10:38 < bridge> @thefe_110: just ping me with your question 10:38 < bridge> Don’t ask if Im here ^^ it only delays everything 10:38 < bridge> oh ok can you send me your servers cfg file :3 10:39 < bridge> Which server 10:39 < bridge> fng server 10:39 < bridge> or ictf 10:40 < bridge> and where i can find logs bans and database files 10:40 < bridge> @thefe_110: https://github.com/ddnet-insta/solofng-cfg 10:41 < bridge> https://github.com/ddnet-insta/gctf-ictf-cfg 10:41 < bridge> Logs are by default stdout you can set a specific location with the `logfile` command 10:42 < bridge> i did set but it didnt appear on the files 10:42 < bridge> Bans don’t get saved to disk use the rcon command `bans` to list them 10:42 < bridge> What did you set and where did you look? 10:43 < bridge> i did set just logs and look to build and data file 10:44 < bridge> what is bans_save command is for 11:41 < bridge> @pioooooo how do I make a clan my favorite, that is not my own? 11:45 < bridge> adding as friend? xd 11:46 < bridge> hmm 11:46 < bridge> > Sometimes I only favorite clan and not name because some just change their names all the time. But favorite clan member is not marked in spectator UI, causing me hard to find them. Also mark them with heart or something else would be great 11:46 < bridge> 11:46 < bridge> Wat 12:27 < ws-client> **** @thefe_110 the sqlite3 database by default is in your storage save location and is called ddnet-server.sqlite 12:27 < ws-client> **** in my case that is `~/.teeworlds/ddnet-server.sqlite` 12:28 < ws-client> **** in yours it might be in some ddnet directory or depending on your storage.cfg 12:28 < ws-client> **** you can also set that with a config 12:28 < ws-client> **** The `bans_save` command saves the bans to a config file that you can load again with the `exec` command 12:29 < ws-client> **** ` Console()->Register("bans_save", "s[file]", CFGFLAG_SERVER | CFGFLAG_MASTER | CFGFLAG_STORE, ConBansSave, this, "Save banlist in a file");` 12:31 < ws-client> **** if I run `./DDNet-Server "logfile foo.txt"` it creates this file for me `~/.teeworlds/foo.txt` but that again is because i use a default storage.cfg and already have a teeworlds folder 12:32 < ws-client> **** you can also just manually log using bash redirects. `./DDNet-Server > mylogfile.txt` 12:32 < bridge> using the UI in server browser, enter only the clan with an empty namr 12:32 < bridge> using the UI in server browser, enter only the clan with an empty name 12:33 < bridge> Ah reacted to the wrong one - go up one message xd 12:37 < bridge> Ye like that 12:39 < bridge> Hello ddnet developer council. I would like to settle a debate between me (Teero) and Tater (sjrc6) and i need your help. 12:39 < bridge> ```cpp 12:39 < bridge> if(i == 0) 12:39 < bridge> i/=5; 12:40 < bridge> else if(i == 1) 12:40 < bridge> i/=10; 12:40 < bridge> else if(i == 2) 12:40 < bridge> i/=20; 12:40 < bridge> else if(i == 3) 12:40 < bridge> i/=30; 12:40 < bridge> ``` 12:40 < bridge> This code is called with `i` being equally distributed between 0,1,2,3. 12:40 < bridge> 12:40 < bridge> My stance is that this code has 4 division operators. 12:40 < bridge> Tater says it only has a single one since only 1 is executed per iteration. 12:40 < bridge> 12:40 < bridge> The thing is if there really only were one division operator here then the code would only take 25% of it's original execution time since `i` is equally distributed so i find it misleading to say there is only a single division operator here. 12:40 < bridge> 12:40 < bridge> sadly i couldn't settle this with tater himself since he was outraged at this and went to sleep. please react with a :music: if you support me or react with a :sendhelp: to side with sjrc6. 12:42 < bridge> afaik, there's 4 division operators 12:43 < bridge> Is this C++? Then the == operator alone could be overloaded to do 9000 divisions 12:44 < bridge> i forgot to say, `i` is actually a ddnet instance, but all the operators are overloaded so it acts like a normal 32bit signed int. 12:44 < bridge> Modern CPUs predict the outcome of each branch in advance, so all four branches here could potentially be evaluated at runtime. 12:48 < bridge> Hmm, are we talking structure or actual execution? 12:48 < bridge> 12:48 < bridge> Sounds like you're both right depending on pov 12:48 < bridge> this is not an official feature, so the issue related to this should be "mark clan members of friends in spectators" 12:49 < bridge> @kebscs you are doing the popup button logic with the pointer of the ClientData, I don't know if this is correct @robyt3 do you know? 12:49 < bridge> This is just button identifier 12:50 < bridge> It can be anything and there wasn't anything else static tied to the row in scoreboard 12:55 < bridge> Has anyone tried to send a command to a server using headless client? 12:58 < bridge> this is done in the integration tests, idk how 13:15 < bridge> what new server? 13:24 < bridge> thinking about this, we could even make the map and besttime clickable, we could even make the scoreboard columns clickable and sort by other things if we wanted to 13:24 < bridge> what have I done 13:38 < bridge> can anybody guide me how I make a clan to my favorite? Apparently this is a feature and I don't know where oO 13:38 < bridge> 13:38 < bridge> 13:39 < bridge> omg I found it 15:16 < bridge> @chillerdragon do you think the new millisecond extension gets just snapshot-delta'd away? 15:16 < bridge> since you usually send the same time just over and over again 15:27 < bridge> @chillerdragon for more than one server one build multiple cfgs or multiple builds 15:36 < bridge> also @essigautomat you did tell me that ddnet using auth_add how do they add new mods to all servers do they login to all servers console and add manually ? 15:37 < bridge> they copy pasta the encrypted password 15:37 < bridge> I love the definition of security cryptography people use 15:37 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1445785933193547817/image.png?ex=69319c93&is=69304b13&hm=35b36ca7260a70dc029324608e756a0aec1618cf5645cf2c76af23b2099afafe& 15:37 < bridge> they copy pasta the encrypted password (or sync the config between them) 15:37 < bridge> so that means i can use add auth in .cfg file 15:38 < bridge> yes 15:38 < bridge> We have FIFO files `sv_input_fifo` which allows us to send console commands to the servers without logging into them 15:38 < bridge> but don't use clear text passwords, use the variant with the encryption 15:40 < bridge> You can use `scripts/hash_passwords.py` or https://ddnet.org/modauth/password.html 15:41 < bridge> (not really encryption technically 😛 just salted hashed) 15:45 < bridge> (still better than saving clear text) 15:47 < bridge> Not just better, it's pretty much the gold standard of credential storage, only thing that could be done better than we did is using an intentionally slow hash function like bcrypt 15:49 < bridge> just add cypher stacking with a random stack based on the blood type of the mod 15:49 < bridge> just add cypher stacking with a random stack based on the blood type of the mod /s 15:53 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1445790002624729252/image.png?ex=6931a05e&is=69304ede&hm=66ce6ffa96ff445dfde60ea514c0f5458931357431308fb5629a205a18f7cd9e& 15:54 < bridge> so i create username and password from this site paste them to my servers cfg and server will decrypth itself ? 15:55 < bridge> what are you reading? 15:55 < bridge> Yes (barring the technical detail that there will never be any decryption happening, but it's not important, it'll work as you are thinking roughly) 15:55 < bridge> Yes ||(barring the technical detail that there will never be any decryption happening, but it's not important, it'll work as you are thinking roughly)|| 15:56 < bridge> https://joyofcryptography.com 15:56 < bridge> This is the book our prof is using for the foundations of cryptography course and it's free, so it's p good 15:57 < bridge> Though idk if I'm enjoying the way it's proving stuff, very weird terminology and methodology IMHO 15:58 < bridge> this is not true from the view, that if B has a flaw that circumvents A, then A can be the most secure thing in the world, but B is still insecure 16:01 < bridge> That's not how that statement works. Think of it like a hypothesis, you make the statement that B is secure, because A is secure. A being secure here is an assertion. We then prove the statement by showing that if B were insecure, one could construct a concrete attacker that defeats A, thus A wouldn't be secure, a contradiction to our assertion that A is secure 16:01 < bridge> If you can't show that, then the hypothesis is wrong, there is more to Bs security then just A being secure 16:03 < bridge> If you can't show that, then the hypothesis is wrong, there may be more to Bs security then just A being secure e.g. 16:19 < bridge> is DDNet capable of utilizing the d-bus daemon currently? 16:19 < ws-client> **** @Assa i added 60 different new integers to the player obj and set all of them to a random value for every snapshot and not a single shield got dropped 16:20 < ws-client> **** i would like to better understand all of it before making a decision here we can not revert later 16:20 < ws-client> **** @thefe_110 for auth_add you can build a script that runs rcon command on all of your servers 16:21 < ws-client> **** @thefe_110 your multiple build cfg question i did not understand 16:26 < bridge> @foroka: why would you use an headless client to send something to the server? Just send to the server directly. Or what is it you want to do exactly? 16:29 < bridge> no, we don't have a dbus client in there 16:32 < bridge> Did you also test with player count? `k` new fields for `n` players is `kn` integers, so it's `64k * 4 = 256k`, IOW 256 bytes you are adding per field on a full server 16:32 < bridge> I like how the issue with this PR is not "should we do this or is the code written good", but "It is doing what it's supposed to and I don't understand why, because network magick" 16:33 < bridge> So at just 4 new fields you are adding an entire kibibyte 16:33 < bridge> in my understanding it is optimized away by snapshot delta magick (since network clips don't apply to players (opposed to characters)), but if your test is correct that implies something else going on 16:34 < bridge> The concern isn't ongoing bandwidth, if a full snap goes over the limit I don't think we fail very gracefully or chop it up 16:35 < bridge> we chop it up 16:35 < bridge> but I don't know if chopping up has a limit 16:36 < bridge> without literally evesdropping on the connection on what is chillerdragon doing I can't tell 16:36 < bridge> isn't the limit of shields and pickups literally the snap object limit, not the networking limit? 16:37 < bridge> btw we are talking about 8 bytes 🙂 16:37 < bridge> It’s more than 8 16:37 < bridge> yes, 8 bytes * 128 is still almost a KB 16:37 < bridge> @essigautomat gratz on ai checkbox 16:37 < bridge> now im getting dumbass comments on pr instead of code reviews 16:38 < bridge> I doubt this, are you sure? I don't remember any mechanism to chop a netmsg. Nor do I remember a snap specific chopping mechanism 16:38 < bridge> ai checkbox more importantly than the code apparaently 16:38 < bridge> I guess I was lucky nobody mentioned I can’t read ai box text haha 16:38 < bridge> @learath2: snaps get split 16:38 < bridge> Into multiple net messages 16:39 < bridge> could you hack ýour way through libnotify, which uses dbus under the hood? xd 16:39 < bridge> NETMSG\_SNAP is only a partial snapshot 16:39 < bridge> Then why are we even talking about this? As long as full snaps are not broken, ongoing traffic is not an issue, especially on values that don't change. Deltashots make those free 16:39 < bridge> They send the part number and the client then assembles them together https://chillerdragon.github.io/teeworlds-protocol/07/system_messages.html#NETMSG_SNAP_part 16:39 < bridge> What do you need? 16:39 < bridge> I guess in the long run we'll remove it 🤷‍♂️ it was not my goal to annoy anyone, for a 3 LOC code I woudln't even ask, but heinrich did 16:39 < bridge> curious, because i like always's idea of selecting the rendered Video within the file explorer when you open the directory via DDNet, but there is no unified way for linux 16:40 < bridge> ^ Learath 16:40 < bridge> @learath2: because I don’t understand what makes the shields disappear and what doesn’t 16:40 < bridge> Connecting a dummy does 16:40 < bridge> Adding 60 randomly changing values doesn’t 16:40 < bridge> I believe it's a rendering limit, not a network limit 16:40 < bridge> like only render x amount of entities 16:41 < bridge> looks like this is just another reason to nitpick or waste time 16:41 < bridge> while i wouldnt care if something is ai generated if the code is good 16:41 < bridge> Is there one through dbus? We could try, but dbus support involves bringing in the entirety of glib :pepeW: 16:41 < bridge> no. I was just curious 16:41 < bridge> code nitpicks are not bad - the cleaner the code the easier it is to maintain, to understand and to add features too 16:42 < bridge> you stated, that you didnt even check the code 16:42 < bridge> so curious about what 16:42 < bridge> I only saw that it wasn't a 3 LoCs PR 16:42 < bridge> curious if you generated the PR using generative AI ^^ 16:42 < bridge> Could `xdg-open` perhaps be a crutch here? We could just call it maybe 16:42 < bridge> i found this beauty: `dbus-send --session --print-reply --dest=org.freedesktop.FileManager1 --type=method_call /org/freedesktop/FileManager1 org.freedesktop.FileManager1.ShowItems array:string:"file:///home/me/path/to/folder/or/file" string:""` xd 16:42 < bridge> 16:42 < bridge> there is another way of using xdg-open, but its a generic call and with no guarantee 16:43 < bridge> unlucky ai cant generate quic 16:43 < bridge> oh the 3LOC was the reverting one, sorry I mixed that up 16:43 < bridge> it could, but hell breaks loose if ai generated encryption breaks and noone understands it xd 16:44 < bridge> Yeah I had a feeling with `xdg-open`. Hm, maybe take a quick look in firefox? They have a show in "file browser" button in downloads I think 16:44 < bridge> also, why are you being so dismissive with me again, @kebscs? 16:44 < bridge> you dont even check the pr out and put disrespectful comments 16:44 < bridge> I probably spent more than an hour on ddnet today, only to be met with "why aren't you reviewing my PR?" 16:44 < bridge> sorry that im not happy about that 16:44 < bridge> why is it disrespectful to ask an objective question? 16:44 < bridge> "Was the whole PR generated?" 16:44 < bridge> he just asked, calling that disrespectful? 16:45 < bridge> I asked a factual question 16:45 < bridge> where do you get from that I view all AI usage as bad? 16:45 < bridge> good idea, will do 16:45 < bridge> I even commented something opposite to that in the checkbox pR 16:45 < bridge> I even commented something opposite to that in the checkbox PR 16:45 < bridge> if all ai usage isnt bad then whats the point of the checkbox question? 16:45 < bridge> the point is to understand AI usage — and filter out bad ones 16:46 < bridge> btw I also understand @kebscs , I have a similar problem with the milliseconds-PR where the netcode is discussed and why it's working, instead of giving the PR a review 16:46 < bridge> I commented that in the introducing PR which you probably read? 16:46 < bridge> if code is good, i documented process of the pr, good description and videos 16:46 < bridge> meh, it uses dbus xd 16:46 < bridge> then the PR is good — I didn't say that the PR would be bad if it was generated 16:46 < bridge> netcode is related to the change, checking the checkbox wont change anything 16:46 < bridge> (fwiw I wouldn't be opposed to just saying no AI at all, I don't even know if we can license AI generated code, given even the person who generated it has dubious copyright on it) 16:47 < bridge> I'd like to ask you to be nicer to your fellow developers @kebscs 16:47 < bridge> i am\ 16:47 < bridge> to active developers the most 16:47 < bridge> it's not nice to put in work into a game and then being met with hostility 16:47 < bridge> exactly 16:47 < bridge> then why am i met with comments that my pr is ai generated 16:47 < bridge> I think we're all in the same boat there 16:47 < bridge> when im the one actually contributing 16:47 < bridge> while quic is abanndoned 16:48 < bridge> see? that's what I mean 16:48 < bridge> you're tellign me that I'm not active and not worthy of "being nice to" 16:48 < bridge> that's the kind of culture I don't want to see in this channel 16:48 < bridge> I think that works badly for projects 16:48 < bridge> https://searchfox.org/firefox-main/source/toolkit/system/gnome/nsGIOService.cpp 16:48 < bridge> 16:48 < bridge> ``` 16:48 < bridge> // Classic DBus 16:48 < bridge> const char kFreedesktopFileManagerName[] = "org.freedesktop.FileManager1"; 16:48 < bridge> const char kFreedesktopFileManagerPath[] = "/org/freedesktop/FileManager1"; 16:48 < bridge> const char kMethodShowItems[] = "ShowItems"; 16:48 < bridge> ``` 16:48 < bridge> 16:48 < bridge> i guess we either pollute the entire client with absolute garbage for a bit of QoL, or we use xdg-open and risk it not working for a handful 16:49 < bridge> i have not said that 16:49 < bridge> you're implying it 16:49 < bridge> > to active developers the most 16:49 < bridge> > then why am i met with comments that my pr is ai generated 16:49 < bridge> > when im the one actually contributing 16:49 < bridge> > while quic is abanndoned 16:49 < bridge> thats on you, if you yourselves think youre inactive 16:49 < bridge> this is also not really nice and doesn't make us get quic any faster 16:49 < bridge> I am not liking where this conversation is headed for the record. This can't possibly end well for any party involved 16:50 < bridge> @learath2 please fix it 16:50 < bridge> please tell people to be nice to others 16:50 < bridge> why am I always the one that has to do it? 16:50 < bridge> because I'm the only one who cares about that? 16:50 < bridge> because you're the one stirring up the pot? 16:50 < bridge> Yeah last time I told him that he said somethings that almost gave me an aneursym, so I just muted him for a bit instead 16:51 < bridge> i'd also like to kindly ask to shift this into a private space, or drop it entirely. (if i may do so, as a mere blue name.) 16:51 < bridge> 16:51 < bridge> i'm just waiting for the regular players to hop onto it and verbally pressure heinrich towards a statement because `where accounts` - i'd actually like to talk about development rn xd 16:51 < bridge> i'd also like to kindly ask to shift this into a private space, or drop it entirely. (if i may do so, as a mere blue name.) 16:51 < bridge> 16:51 < bridge> i'm just waiting for the regular players to hop onto it and verbally pressure heinrich towards a statement because `where accounts` ..(AGAIN).. - i'd actually like to talk about development rn xd 16:51 < bridge> I apologize for that again :D 16:52 < bridge> I have way too many PRs that need review 🙈 16:52 < bridge> I can't keep up with all the code I want to write 16:52 < bridge> Honestly, if we want to be strict about it, there is only one answer to behaviour like this, but I'd rather not lose a developer. So I just try to de-escalate instead, if it means I need to block someone for a bit, I do that 16:52 < bridge> accounts :pepeH: 16:52 < bridge> please be nice to other developers, we don't talk about accounts here 16:53 < bridge> perhaps we should be strict about it, so that we don't come back to this point forever 16:53 < ws-client> **** @learath2 is the vote yes issue hear say or did you actually confirm it? 16:53 < bridge> dont you dare Avo, i'll verbally abuse your moderators in #mapping_chatroom on KoG again! 16:53 < bridge> 4 mods mentioned it, so I think it has to be real 16:53 < bridge> I can try to confirm it 16:53 < bridge> Try it, but dont send me a DM after you get punished 😄 16:53 < ws-client> **** i struggle to reproduce 16:53 < bridge> @smashtw would never! 16:54 < bridge> @smashtw would never! :pepe: 16:54 < ws-client> **** i tried this https://github.com/ddnet/ddnet/issues/11379 16:54 < bridge> @chillerdragon then you should consult a doctor :justatest: 16:54 < bridge> xD 16:54 < bridge> can you try both voting for and against something? it seems like there is stuff broken on both ends 16:55 < bridge> i.e force_vote yes, and force_vote no 16:55 < bridge> Thats why I mostly wait a few months after Chiller PRed something 🙁 16:55 < ws-client> **** @learath2 what does "not work" even mean? 16:55 < bridge> Maybe the issue is that the forced vote command is executed by the person forcing it, and perhaps that person does not have permission to execute it 16:55 < bridge> are not a doctor yet? of computer science ofc 16:55 < bridge> i.e force_vote yes, and force_vote no (oh nvm the issue mentions that) 16:55 < ws-client> **** @learath2 sounds like a fix not a bug 16:55 < bridge> no, because it's not wirtschaftlich 16:55 < bridge> like in my current position I get the same amount of money 🤷‍♂️ 16:56 < ws-client> **** if you cant run a rcon command you should not be able to force the vote 16:57 < ws-client> **** maybe this https://github.com/ddnet/ddnet/pull/10963#issuecomment-3425560295 16:57 < bridge> Mh, I don't think so, (if that is indeed what is happening). Forcing a vote is IMO distinct from executing an arbitrary command. The ability to force a vote gives you the possibility to execute a subset of commands that is allowed by the people that have access to adding vote options 16:57 < bridge> I am doing the anti- @ryozuki and doing a database backup rn :justatest: 16:57 < bridge> I am doing the anti- @ryozuki and doing a database backup rn :justatest: ♥️ 16:57 < bridge> nooooooooo 16:57 < bridge> 16:57 < bridge> :hmm: 16:57 < bridge> i meant lets say i will create 5 servers do i need to compile 5 ddnet-insta server or compile only one and make 5 different config and run them with same compiled server 16:58 < ws-client> **** you only need one binary 16:59 < ws-client> **** you can run it multiple times 16:59 < ws-client> **** with different ports 16:59 < bridge> technically you could even just create 1 multi-world server who takes multiple ports 16:59 < bridge> but what do I know, I just already did that 5 years ago 17:10 < bridge> @essigautomat isnt number of shileds, based on snap objects? 17:10 < bridge> so if you extended the old player it shoudldnt affect it? 17:11 < bridge> or how does it work 17:13 < ws-client> **** @learath2 could you tell your mods to test this one https://github.com/ddnet/ddnet/pull/11381 17:13 < bridge> let me test it rq 17:16 < bridge> whats rcon client id 17:16 < bridge> shouldnt it be the authorized's player id that forced the vote? 17:16 < ws-client> **** why 17:16 < bridge> idk whats rcon client id 17:16 < ws-client> **** imo it should be the same as passing the vote by majority 17:17 < ws-client> **** idk either 17:17 < ws-client> **** i just copy pasted 17:17 < ws-client> **** why would you want to run the command differently when forced 17:17 < ws-client> **** isnt force supposed to be the same as enough yes votes? 17:18 < bridge> idk maybe it does other stuff 17:18 < ws-client> **** but why should it? 17:18 < ws-client> **** lets assume the bugged case that should not happen that players call votes and once they pass they result in permission errors 17:18 < ws-client> **** should those votes not result in permission errors when forced yes by an authed player? 17:19 < ws-client> **** imo the code should be identical 17:19 < ws-client> **** if not there should be a comment defeding why it drifted 17:19 < bridge> forcevoting yes works 17:19 < bridge> 2025-12-03 17:18:57 I chat/server: *** Authorized player forced vote 'yes' 17:19 < bridge> 2025-12-03 17:18:57 I chat/server: *** 'not dammy' has left the game (You have been banned for 5 minutes (Banned by vote)) 17:19 < ws-client> **** otherwise i assume its a bug that got introduced by someone only updating one branch 17:19 < bridge> 2025-12-03 17:18:57 I chat/server: *** Vote passed enforced by authorized player 17:19 < ws-client> **** @melon and on master its broken for you? 17:19 < bridge> yes 17:19 < ws-client> **** how xd 17:20 < bridge> :Shruggo: xd 17:20 < ws-client> **** how do u login? 17:20 < bridge> tbh idk what m_RconClientId is for even 17:20 < bridge> is it like main admin? 17:20 < ws-client> **** the id the rcon command is being executed with 17:20 < ws-client> **** used for checking if you can kick others for example 17:20 < bridge> "exec ddnet_auth.cfg; rcon hide_auth_status 1; rcon show_ips 1; clear_remote_console; echo DeeDeeNet" 17:21 < bridge> so maybe it could be executes by the player 17:21 < bridge> that is auther 17:21 < bridge> that is autheds 17:21 < ws-client> **** whats ddnet_auth.cfg 17:21 < bridge> "exec ddnet_auth.cfg; rcon hide_auth_status 1; rcon show_ips 1; clear_remote_console; echo DeeDeeNet" 17:21 < bridge> 17:21 < bridge> using rcon_login 17:21 < bridge> that is authed 17:21 < ws-client> **** i use sv_rcon_password hm 17:21 < ws-client> **** @kebscs omg no xd 17:21 < ws-client> **** @kebscs why should it 17:21 < ws-client> **** that would make force yes weaker 17:21 < ws-client> **** what if the helper that can do `vote yes` actually has no access to `sv_map` 17:22 < ws-client> **** then the force yesed map vote would fail 17:22 < bridge> alr youre the boss im just speculating :kek: 17:22 < bridge> the rcon id kinda doesnt make sense to me but it is what it is with ddnet code 17:22 < ws-client> **** server code hater x 17:31 < bridge> no idea, remember I asked you how to netcode this xD 17:36 < bridge> well current one is ok then 17:36 < bridge> or 2nd idea would be to send record for all players, and then when they beat their top time 17:36 < bridge> bcs its not updated as often as score 17:37 < bridge> wdym by that? 17:37 < bridge> its top time so only updated on join or on finish 17:37 < bridge> ddnet score was updated every kill? so kinda had to be in some common net msg 17:37 < bridge> ddnet score was updated every kill? so kinda had to be in some common net obj 17:37 < bridge> isn't it currently only sending deltas? 17:38 < bridge> maybe it is actually 17:38 < bridge> then its good 17:38 < bridge> wait no kebs, I am only sending the best time, not the score 17:38 < bridge> yes they are related, because of how timescores are currently implemented 17:38 < bridge> 👍 17:38 < bridge> i approved for me its good 17:39 < bridge> today I have a 12 hour work day ... I am waiting for a db backup to finish before migrating 17:39 < bridge> im just melting 🫠 17:40 < bridge> paid overtime or how does it work in germany 17:40 < bridge> im cold 17:40 < bridge> ``` 17:40 < bridge> // set timescore 17:40 < bridge> float Seconds, Millis; 17:40 < bridge> Millis = std::modf(GameServer()->Score()->PlayerData(m_ClientId)->m_BestTime, &Seconds); 17:40 < bridge> Millis = std::floor(Millis * 1000.0f); 17:40 < bridge> 17:40 < bridge> if(m_Score.has_value()) 17:40 < bridge> { 17:40 < bridge> pDDNetPlayer->m_FinishTimeSeconds = static_cast(Seconds); 17:40 < bridge> pDDNetPlayer->m_FinishTimeMillis = static_cast(Millis); 17:40 < bridge> } 17:41 < bridge> else 17:41 < bridge> { 17:41 < bridge> pDDNetPlayer->m_FinishTimeSeconds = FinishTime::NOT_FINISHED; 17:41 < bridge> pDDNetPlayer->m_FinishTimeMillis = 0; 17:41 < bridge> } 17:41 < bridge> ``` 17:41 < bridge> 17:41 < bridge> @kebscs I am only updating on new BestTime 17:41 < bridge> that comment is missleading 😠 17:41 < bridge> yea i thought the net obj is sent every tick 17:41 < bridge> but if its sent when any of the value has changes then its good 17:41 < bridge> I actually don't know tbh 17:41 < bridge> even though it has some other values too, but shouldnt be a problem 17:42 < bridge> I just noticed that I am cecking against m_Score there 17:42 < bridge> hmm 17:43 < bridge> I guess I have to 17:44 < bridge> :fuckyousnail: 17:46 < bridge> i just wanted to use the emoji 17:46 < bridge> igot it back 17:48 < bridge> ``` 17:48 < bridge> if(Seconds > std::numeric_limits::max()) 17:48 < bridge> { 17:48 < bridge> // some people are just insane. 17:48 < bridge> Seconds = std::numeric_limits::max(); 17:48 < bridge> } 17:48 < bridge> ``` 17:48 < bridge> 17:48 < bridge> Should I let the comment there? 17:49 < bridge> Ah I have a better idea 17:49 < bridge> isnt it int32? 17:49 < bridge> it's not a uint 17:49 < bridge> because the netcode only supports ints 17:49 < bridge> yes I could also just do floating point shenanigans there 17:49 < bridge> normal ints or int32 17:49 < bridge> uh 17:50 < bridge> ye looks like normal int 17:51 < bridge> will this ever happen, if tick gets overflown first? and old score also had seconds 17:52 < bridge> oh true 17:52 < bridge> it would happen if I would just put in the milliseconds 17:52 < bridge> but since I split it up it can't happen 17:53 < bridge> I guess in theroy it could happen if you enter bullshit into the database 17:56 < bridge> I almost want to add a dbg_assert and let the server crash 18:01 < bridge> > Nice, we could move away from the player list now, if there will be something for mobile version. (Or we could keep it for mobile only) 18:01 < bridge> 18:01 < bridge> @kebscs almost, there is one thing left I see with this breaking rn: 18:01 < bridge> 18:01 < bridge> If you have enough spectators, it will collapse some 18:03 < bridge> :tear: 18:08 < bridge> maybe we can make the collapse button clickable and then it has a scrollbar, and maybe I fight zombies with plants 18:11 < bridge> Maybe remove spectator team 18:12 < bridge> Just show the spectators in the player list 18:12 < bridge> You can spectate while playing anyway 18:13 < bridge> putting them at the end and maybe in their own special "spectator team" would work 🤔 18:13 < bridge> That's what I meant in https://github.com/ddnet/ddnet/issues/11366#issuecomment-3597924395 18:14 < bridge> Then we could gain additional height by removing the old spectator view 18:14 < bridge> I thought you were talking about listing them inside the spectators section 18:14 < bridge> So after we remove super we make it spectator? 18:14 < bridge> no need to do it like that, we can detect that fully on client side and inside the scoreboard 18:15 < bridge> Yeah, spectators are separate from ddrace teams 18:15 < bridge> I see 18:15 < bridge> That would be good 18:15 < bridge> I have an idea to do this, but not today 18:18 < bridge> This is probably done in other places too, but it should be avoided because it's unreadable and can lead to subtle bugs if not done carefully. If the same address is reused somewhere else then both UI elements will be linked. Better introduce a separate array of objects containing UI IDs for the elements you need. If you don't need a typed UI element like `CButtonContainer`, you can simple use a `char` as a button ID. 18:20 < bridge> I noticed, and using a static variable there also doesn't work, because it would be the same for every player. For the second UIRect I needed I went for the player name instead 18:21 < bridge> Taking the pointer of an object is also confusing because it's the same as the pointer to the first element 18:21 < bridge> so I was just lucky, that the name was not the first element :justatest: 18:22 < bridge> yeah 18:22 < bridge> Add a class with the UI elements for each client, then create an array of that in `CScoreboard` instead of reusing the client data addresses 18:22 < bridge> but on the other side I could use the object pointer + 1 then 18:22 < bridge> Add a class with the scoreboard UI elements for each client, then create an array of that in `CScoreboard` instead of reusing the client data addresses 18:23 < bridge> yes, this sounds better - however this was out of scope for this PR 18:23 < bridge> Using unaligned addresses is possible and makes this even more confusing. Also, it's currently being done in the editor :monkaS: 18:23 < bridge> :monkaS: 18:23 < bridge> what could go wrong there 18:24 < bridge> I think it should be done first as cleanup 18:26 < bridge> It works out because the UI element IDs are `int`s that are 4 bytes and we need at most 4 UI IDs for the shift left/right/up/down value selector 18:27 < bridge> as long as ints are 32 bits which should always be the case 18:27 < bridge> But for new non-editor code I use `char`s because there's no need for the extra 3 bytes 18:27 < bridge> as long as ints are at least 32 bits which should always be the case 18:28 < bridge> @robyt3 can you take a look at #11310? It's blocking me 18:28 < bridge> https://github.com/ddnet/ddnet/pull/11310 18:29 < bridge> I'll look over your quad middle color PR 18:32 < bridge> `CColor` in maps is kinda cursed btw, maps store colors as 4 integers but they are only in 0-255 range :thonk: 18:35 < bridge> yes I noticed, I was fully confused at first why this was not immediately overflowing for you 18:36 < bridge> why did it not create a crashlog oO 18:43 < bridge> You mean while using the feature? 18:46 < bridge> 18:46 < bridge> ermmm 18:46 < bridge> XD 18:46 < bridge> "tas-server" 18:46 < bridge> yes 18:47 < bridge> -.- we can't delete this can we? 18:47 < bridge> even if its server-side :c 18:50 < bridge> probably not 18:50 < bridge> he could checkout the branch and hard reset all 18:51 < bridge> maybe maintainers can too since its possible to edit other prs 18:53 < bridge> ah okay. 18:53 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1445835273442295828/image.png?ex=6931ca87&is=69307907&hm=b493d19b551872450ceedf731d031af5424874f6b241f0868be5e4c50b5b136b& 18:53 < bridge> atleast its honest? 18:57 < bridge> he didn't select the checkbox 18:59 < bridge> he didn't pass the trust test 18:59 < bridge> would have declined that PR anyways 19:25 < bridge> did you look at the code? its full llm xd 19:25 < bridge> it's also bad 19:32 < bridge> xd? 19:33 < bridge> nothing is worse than db upgrades 19:36 < bridge> you upgrade mariadb, and finally the mariadb-backup package is missing 19:37 < bridge> you install it, and finally mariadb-server is uninstalled :nouis: 19:37 < bridge> and then you get the message, that the server is depending on something that is uninstallable 19:48 < bridge> When you are running a database cluster, and every fucking instance is on a different os and database version 19:48 < bridge> (╯°□°)╯︵ ┻━┻ 19:48 < bridge> how did this desyn? 19:48 < bridge> wtf are they doing 19:54 < bridge> need mental support? 19:55 < bridge> call +49 @teero777 19:55 < bridge> no thank you, usally the support needs a video for me to understand basic issues 19:55 < bridge> ^ 19:56 < bridge> mental support doesn't need to understand your issue 19:56 < bridge> https://tenor.com/view/lillate-goth-gf-bigtiddy-bigtiddygothgirl-btgg-gif-20274026 19:56 < bridge> in 4 minutes I am clocking in 12 hours 19:57 < bridge> fun? 19:57 < bridge> no 20:09 < bridge> @kebscs can you make stats for me? 😛 20:09 < bridge> if anyone disagrees, i pull up your template stats 😎 20:09 < bridge> sure xd 20:09 < bridge> xD 20:09 < bridge> I guess I forget to click screenshots even if I add them 20:11 < bridge> the script broke now for some reason 20:11 < bridge> .. 20:11 < bridge> :kek: 20:12 < bridge> ah nvm you just didnt have any prs before 9658 20:13 < bridge> AssassinTee 20:13 < bridge> All PRs: 131 20:13 < bridge> With template: 109 20:13 < bridge> [108, 37, 23, 3, 7, 42, 0] 20:13 < bridge> ah nvm you just didnt have any prs before 9658 until 5413 20:13 < bridge> was just going to ask, because I know I had very few early PRs 20:14 < bridge> ``` 20:14 < bridge> Maintainers: 20:14 < bridge> All PRs: 3512 20:14 < bridge> With template: 2096 20:14 < bridge> [2051, 373, 127, 73, 270, 386, 111] 20:14 < bridge> 20:14 < bridge> Maintainers excluding roby, assa: 20:14 < bridge> All PRs: 2041 20:15 < bridge> With template: 838 20:15 < bridge> [804, 166, 58, 33, 125, 158, 76] 20:15 < bridge> ``` 20:15 < bridge> :justatest: 20:15 < bridge> 108 of 109 tested ingame 20:16 < bridge> so robyt alone wrote 1000 PRs is what I am reading out of this 20:17 < bridge> yea ig 20:17 < bridge> :deen_star: 20:17 < bridge> and that is since 2020 20:17 < bridge> and that is since 10.2020 20:17 < bridge> :poggers2: 20:17 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1445856592107933726/image.png?ex=6931de62&is=69308ce2&hm=41d64b170b03c891f42510948550575dd703cec1034ace4f9d773236e9f3ad67& 20:18 < bridge> that's not a pull shark anymore, that's a Pull MEG 20:19 < bridge> roby+chiller is almost half of all mainainers prs alone 20:19 < bridge> :deen_star: 20:19 < bridge> I was wondering about the 42, but at the beginning people always assumed I was changing physics, even when I was not 😠 20:20 < bridge> so I almost always press the no-physics button 20:20 < bridge> so I almost always press the no-physics button, well 40% is alsmost always right? 20:20 < bridge> so I almost always press the no-physics button, well 40% is almost always right? 20:21 < bridge> i think most checkboxes dont apply to most prs 20:21 < bridge> thats why tested physics has so low 20:21 < bridge> or unit test 1% 20:22 < bridge> i want the tested physics checkbox 20:22 < bridge> its important xd 20:22 < bridge> i want the changed physics checkbox 20:22 < bridge> tested in game implies you tested physics imo 20:23 < bridge> what is this about testing? the checkbox said that you didn't change any physics xd 20:23 < bridge> and that should be caught by review anyway, and not by checkbox 20:23 < bridge> checkbox makes it easier 20:23 < bridge> please keep it 20:23 < bridge> with it being checked only 23% times idk 20:24 < bridge> the rest of the prs change physics :trollet: 20:24 < bridge> please let the checkbox there, it's for "i AM ACTUALLY changing physics, hold my beer" 20:24 < bridge> i mean it could be smarter, to apply to most prs instead to only these in game 20:24 < bridge> or contributing.md could say smth about physics 20:25 < bridge> or "I tested the change in-game and changed no physics" 20:27 < bridge> i mean sure, can you make the markdown link the contributing.md please? 20:27 < bridge> ofc! 20:48 < bridge> time to crash robyts PR in a debugger 20:50 < bridge> What did you do to crash? Did you press any keys or use the history? 20:50 < bridge> I used the history and multi-quad-deleted 20:50 < bridge> i might hit the other crashbug 20:50 < bridge> i might have hit the other crashbug 20:51 < bridge> I crashed again 🥳 20:52 < bridge> ``` 20:52 < bridge> void CEditorActionDeleteQuad::Undo() 20:52 < bridge> { 20:52 < bridge> std::shared_ptr pLayerQuads = std::static_pointer_cast(m_pLayer); 20:52 < bridge> for(size_t k = 0; k < m_vQuadsIndices.size(); k++) 20:52 < bridge> { 20:52 < bridge> pLayerQuads->m_vQuads.insert(pLayerQuads->m_vQuads.begin() + m_vQuadsIndices[k], m_vDeletedQuads[k]); 20:52 < bridge> } 20:52 < bridge> } 20:52 < bridge> ``` 20:52 < bridge> 20:52 < bridge> uhm seems unrelated 20:54 < bridge> I don't get this code at all 20:54 < bridge> like the debugger tells me, that this undo function is bs 20:54 < bridge> Something is definitely pretty broken when you revert the deletion of multiple quads 20:55 < bridge> m_vQuadIndices is not a sorted array, here we are trying to insert beyond the size of m_vQuads 20:56 < bridge> I think this is actually unrelated to your PR 20:58 < bridge> Can you open an issue for it? 21:22 < bridge> @robyt3 one last time? 🙈 23:04 < bridge> Thank you Robyt :deen_star: 23:53 < bridge> does the demo not play intraticks? 23:54 < bridge> Not when you skip to the next/previous tick 23:57 < bridge> hmm, it doesn't have prediction ticks obviously 23:58 < bridge> I just found yet another 8 year old bug in the envelope animation 23:58 < bridge> the animation was always off by 1 tick 23:59 < bridge> I am not angry, just sad at this point