00:00 < bridge> the pr looks good i thought its going to be more complicated 00:01 < bridge> for me id prefer if leader was tied to team instead a field in every player 00:01 < bridge> other than that is good imo 00:06 < bridge> yeah i had it on my mind for 2 weeks at this point. I havent had such a flawless coding session in a long time, i usually never think about code in advance 00:07 < bridge> true, i think it would be better like that as well 00:07 < bridge> ill change that 00:24 < bridge> is there really no way to determine the cause of a disconnection to be a ban other than checking for "banned" in the reason string? 00:24 < bridge> i was hoping for some int/enum thing but i guess that works 00:25 < bridge> Yes that’s the way to go 00:25 < bridge> And it works pretty well 00:25 < bridge> alright. should i be concerned about case-sensitivity? i am only connecting to ddnet servers if this helps 00:25 < bridge> i think lowercase will always catch it, since its in the first bit, before any specified reason 00:25 < bridge> I think it’s always the same message 00:26 < bridge> „You have been banned for x minutes“ 00:26 < bridge> iirc I am on phone 00:26 < bridge> yeah it is that, thank you :3 00:26 < bridge> I just get banned a lot so I happen to know it well 00:26 < bridge> xD 01:07 < bridge> what are you trying to do? 01:16 < bridge> ```js 01:16 < bridge> const on_disconnect = (client, reason) => { 01:16 < bridge> const ip = ip_of(client) 01:16 < bridge> console.log(`disconnected from ${ip}: ${reason}`) 01:16 < bridge> if (reason.includes('banned')) kicks.add(ip) 01:16 < bridge> clients.delete(ip) 01:16 < bridge> } 01:16 < bridge> ``` 01:16 < bridge> it works already but i was just wondering if there was a better way. chiller said there's not so idk 01:20 < bridge> having another sorta weird issue, im still trying to avoid checking snapshot events, but there's no way to tell if i was renamed joining a server with someone with my name already taken without the snaps? 01:21 < bridge> because client.name is still kept as 'original' 01:21 < furo> Yes, there is no kick or ban in the protocol itself. They're just different reasons sent with the control close packet. 01:22 < bridge> im also trying to figure out how the name renegotiation works, if the server knows the wanted name and doesnt require that the client re-request it 01:22 < bridge> if your name is displayed differently in scoreboard then you got renamed 01:22 < bridge> checking if a player is "me" requires snaps, i think 01:23 < bridge> `client.SnapshotUnpacker.OwnID` is the most light thing ive been using, but i have to compare that against the events i have 01:27 < bridge> no idea then if its not in game 01:31 < furo> gorp_tw: The server does not care about your wanted name (if your name was taken). DDNet client keep resending the "ChangeInfo" packet until it gets the name it wants. 01:52 < bridge> ah okay, so i will have to figure out if this lib handles it or send that 02:29 < bridge> it doesnt, you would have to implement that manually (i think client.game.SendChangeInfo or something something changeinfo) 02:29 < bridge> you would have to check through the snapshotunpacker to find your own client_info (it has the same id as client.SnapshotUnpacker.OwnID) and check the name of that 02:30 < bridge> it doesnt, you would have to implement that manually (client.game.ChangePlayerInfo) 04:05 < chillerbot123> Elo @teero777 I just wanted to remind you that: fix demo tests 04:36 < bridge> hi 04:50 < bridge> Hi 09:29 < bridge> hm, suddenly i need NETMSGTYPE_SV_TEAMSSTATE 09:30 < bridge> that ID is unfortunately not already defined in the ts lib AFAICT 09:33 < ws-client> **** go send pr to lib then 09:33 < bridge> yeah, im figuring out if more netmsgs are missing, then just trying to add them 09:53 < bridge> laughs in trailing tab character 09:53 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1453309474092875828/image.png?ex=694cfb6b&is=694ba9eb&hm=ebce9cc0e97123b08e6bf6d0a1946075caf9b65623aa548536a2d90e9f8874da& 10:30 < bridge> iiiiyaaaa i am scratching my head at this 10:33 < bridge> https://github.com/MilkeeyCat/ddnet/commit/3f81e3588ed84d8e7d0c550bc0e9accc03293664 so it seems like Milkeey added this to fork but it's not in upstream network.py 10:33 < bridge> but then there's definitely client handling in https://github.com/ddnet/ddnet/blob/c6be37c78228932d2673130d508301fa8730ee2c/src/game/client/gameclient.cpp#L1112 10:34 < ws-client> **** how did you end up at milkeeys fork?? 10:34 < bridge> i cast a wide net to try to find any information xD 10:35 < bridge> just what popped up, this was in January 10:35 < ws-client> **** speaking of milkeey @milkeeycat sos 10:35 < ws-client> **** https://github.com/MilkeeyCat/ddnet_protocol/blob/2e51204054f09e159b4db054f16f87f4d425e526/include/ddnet_protocol/packer.h#L70 10:35 < ws-client> **** i ran into a circular dependency issue 10:35 < ws-client> **** the packer depends on `DDNetMessageKind` which pulls in literally everything as a dependency 10:36 < ws-client> **** imo the packer should not depend on the entire protocol it should just pack 10:36 < ws-client> **** idk wat to do 10:36 < ws-client> **** i guess ill move the message kind enum to the packer 🤷 10:36 < bridge> that doesn't sound like a circular dependency issue? it's just a "I wish it had less dependencies"? 10:37 < ws-client> **** oh yea 10:37 < ws-client> **** but now it became one for me 10:37 < bridge> that library is a bit annoying for using the `ddnet_` prefix in functions 10:38 < ws-client> **** annoying for who? 10:38 < bridge> that should be reserved for ddnet code ^^ 10:38 < ws-client> **** ah i see 10:38 < ws-client> **** but ddnet doesnt use it right? 10:38 < bridge> maybe use something like ddnetp or so 10:38 < bridge> not right now, no 10:38 < ws-client> **** we can change it as soon as ddnet uses it i guess 10:39 < ws-client> **** otherwise we have an longer uglier prefix without even solving a real problem 10:39 < ws-client> **** but its milkeeys call 10:39 < bridge> I guess I'll open an issue 10:39 < ws-client> **** <:poggers2:1008007455936094328> 10:39 < bridge> what was the motivation for NetMessageEx? not sure if i need to make special considerations about these 10:39 < ws-client> **** ddnet_protocol christmas activity 10:40 < ws-client> **** @gorp_tw ddnet extension basically 10:40 < bridge> tslib does handle UUIDManager 10:40 < ws-client> **** ddnet adds messages in a way to not conflict with teeworlds 10:40 < bridge> Ex is alsways extension, there is also NetObjectEx 10:40 < ws-client> **** you dont need to worry about it @gorp_tw 10:40 < ws-client> **** blazingly typescript is handling it all for u 10:40 < bridge> alright. im not even sure if sv_teamsstate is what i need really... im kinda tired and need sleep 10:40 < ws-client> **** only thing that could be interesting for you is that non ddnet servers dont send it 10:40 < bridge> but i do need to figure out ddrace teams 10:41 < bridge> the teams are inside the ddnetplayer as far as I remember 10:41 < bridge> like they are not a seperate netmessage, just an ID per player 10:42 < bridge> > i guess ill move the message kind enum to the packer 🤷 10:42 < bridge> does that mean I have to include packer in `chunk.h` to have access to `DDNetMessageKind`? xd 10:42 < bridge> it seems they're in `Sv_TeamsState` message 10:42 < bridge> which is bad an there's probably an issue for that 10:42 < ws-client> **** @milkeeycat yes but better than the other way around imo 10:42 < ws-client> **** better everyone including the packer than the packer including everyone 10:42 < bridge> 🤔 maybe I also don't understand how teams are handled on the network side 10:43 < ws-client> **** it solved the compilation issue for me and i feel like it will be easier to work with in the future @milkeeycat 10:43 < ws-client> **** its just a bit odd to have all the message names in the packer header 10:43 < ws-client> **** but eh ... idk how to avoid that 10:44 < bridge> I don't see it in the `DDNetCharacter`/`DDNetPlayer` 10:44 < bridge> yeah that was what i gathered, but having a tough time finding exactly where this is 10:45 < bridge> my thought was Character -> CharacterCore 10:45 < bridge> since its not part of the outer fields in this lib 10:45 < bridge> the scoreboard uses m_Team, I believe it was from the ClientData, but I'd need to look it up 10:45 < bridge> all other references to teams in this lib are 0 for ddrace (vanilla teams) 10:46 < bridge> `CNetObj_PlayerInfo` @heinrich5991 10:47 < bridge> I don't see it in there, either 10:47 < bridge> contains m_Team 10:47 < bridge> or are we not talking about ddnet teams? 10:47 < bridge> that is the vanilla team, IIRC 10:47 < ws-client> **** its a vanilla object so its a vanilla team 10:47 < bridge> i verified this by changing teams live and inspecting the net change 10:47 < bridge> oh huh 10:47 < bridge> yeah so i have no idea where ddrace team anything is XD 10:48 < bridge> oh yes it is, whater CTeamsCore does 10:48 < bridge> https://github.com/ddnet/ddnet/issues/3795 10:48 < bridge> I think it's just the message you found earlier, @gorp_tw 10:49 < bridge> `Sv_TeamsState` 10:49 < bridge> someone™ should put that into the snapshot instead 10:49 < bridge> because it breaks demo playback otherwise 10:49 < bridge> yeah it had data and now it does not 10:49 < bridge> `MsgId == NETMSGTYPE_SV_TEAMSSTATE || MsgId == NETMSGTYPE_SV_TEAMSSTATELEGACY)` 10:49 < bridge> according to network.py at least 10:49 < bridge> yes, network.py is incorrect there 10:49 < bridge> you need to manually unpack the 64 twints 10:50 < bridge> yeah sorry, ive just been leaning on network.py as a quicker reference 10:50 < bridge> cool beans 10:50 < bridge> but it is correct that it is int[64] 10:51 < bridge> apparently `int[128]` 10:51 < bridge> https://github.com/heinrich5991/libtw2/blob/763a1d9782b3c12730a23f803f0bc4f938941775/gamenet/generate/spec/ddnet-19.1.json#L721-L733 10:52 < bridge> re: `|| MsgId == NETMSGTYPE_SV_TEAMSSTATELEGACY)`, is this given as 64? 10:52 < bridge> or what is the difference with `LEGACY`? 10:53 < ws-client> **** just ignore legacy 10:53 < ws-client> **** its old 10:53 < ws-client> **** .. 10:53 < bridge> if im PRing this to a general library, i should probably consider it 10:53 < ws-client> **** a 10:53 < bridge> like you told me to go do 10:53 < bridge> the difference is that `SV_TEAMSSTATELEGACY` isn't a extended message 10:54 < bridge> I guess it contains only 16 integers if I understand that correctly oO 10:54 < bridge> and `SV_TEAMSSTATELEGACY` isn't sent anymore by ddnet servers to new clients 10:54 < bridge> the difference is that `SV_TEAMSSTATELEGACY` isn't an extended message 10:54 < ws-client> **** just dont implement anything legacy helps us to move forward 10:54 < bridge> hm, so they still unpack the same 10:54 < bridge> but one is namespaced 10:54 < ws-client> **** speaking of 10:54 < ws-client> **** btw that js lib is still 0.6 10:54 < bridge> yes i know 10:54 < ws-client> **** you should consider sending a pr to use 0.7 technology instead 10:55 < ws-client> **** hrhrhrhhr 10:55 < bridge> i am just a dog 10:55 < bridge> i dont know things 10:55 < ws-client> **** no u pro 10:55 < bridge> i dont even know how to write CPP and i am translating CPP into TS 10:56 < bridge> I wouldn't use the 0.7 protocol, it's essentially dead 10:56 < bridge> the only thing keeping it alive is servers and clients _also_ supporting it 10:56 < bridge> it does seem like basically everything uses 0.6 and extensions 10:56 < bridge> so i didnt bother looking at any 0.7 10:58 < ws-client> **** you cant even play on recent vanilla servers with the js lib -.- 10:58 < ws-client> **** but you could join ddnet servers with 0.7 10:58 < ws-client> **** but who am i to judge 10:58 < ws-client> **** i am literally writing a 0.6 snapshot parser right now :D 11:00 < bridge> I think the low-level snapshot format didn't change between 0.6 and 0.7 11:05 < ws-client> **** not much ye 11:05 < bridge> at all? 11:06 < ws-client> **** possibly at all yes 11:06 < bridge> ok, was just wondering whether you knew more 11:07 < ws-client> **** i recently implemented both in python but i already forgot -. 11:07 < bridge> I think my libtw2 parser didn't have to change between these versiosn 11:07 < ws-client> **** 0.7 just has the race edge case 11:07 < ws-client> **** GAME_DATA_RACE, PLAYER_INFO_RACE 11:08 < ws-client> **** that were added after the 0.7 release 11:08 < ws-client> **** so they send the size 11:08 < bridge> I wonder that 11:08 < bridge> ah right, you need different default object sizes 11:08 < bridge> between versions 11:08 < bridge> ```js 11:08 < bridge> } else if (chunk.msgid == NETMSG.Game.SV_TEAMSSTATE) { 11:08 < ws-client> **** yea that too 11:08 < bridge> let unpacker = new MsgUnpacker(chunk.raw); 11:08 < bridge> const teams = Array.from({ length: 64 }).map(() => unpacker.unpackInt()) 11:08 < bridge> this.emit("teams", teams) 11:08 < bridge> } 11:08 < bridge> ``` 11:08 < bridge> i am tired but i think this is right 11:08 < bridge> gn 11:08 < bridge> good night 🙂 11:08 < ws-client> **** ??? 11:08 < ws-client> **** bro its 11am 11:09 < ws-client> **** ah u told it to him xd 11:09 < bridge> ``` 11:09 < bridge> // create delta 11:09 < bridge> m_SnapshotDelta.SetStaticsize(protocol7::NETEVENTTYPE_SOUNDWORLD, m_aClients[i].m_Sixup); 11:09 < bridge> m_SnapshotDelta.SetStaticsize(protocol7::NETEVENTTYPE_DAMAGE, m_aClients[i].m_Sixup); 11:09 < bridge> ``` 11:09 < bridge> what is this magic? 11:09 < ws-client> **** thats basically what heino said 11:09 < ws-client> **** different item sizes for 0.6 and 0.7 11:09 < ws-client> **** so it adjusts the sizes based on who receives the snap 11:10 < ws-client> **** its a bit funny that it passes a bool as size tho xd 11:10 < ws-client> **** i remember looking into that once i forgot my findings already 11:11 < bridge> That's was what I wanted to know 11:11 < bridge> why it passes a boolean?? 11:11 < bridge> How could it works? 11:11 < ws-client> **** well its just 1 and 0 as size then :D 11:12 < bridge> looks like a bug 11:13 < ws-client> **** setting it for 0.6 to 0 doesnt really matter 11:13 < ws-client> **** because the type ids are not used in 0.6 11:13 < ws-client> **** the highest snap type id in 0.6 is `20 event_damage_indicator` 11:14 < ws-client> **** and protocol7 sound world and damage are 21 and 22 11:14 < ws-client> **** but their size is not 1 11:14 < ws-client> **** i guess the size doesnt matter at all because its not even used i assume 11:15 < ws-client> **** wait it sets the 0.6 sizes :D 11:15 < ws-client> **** lel 11:15 < ws-client> **** ok this code does nothing 11:15 < bridge> :thonk: 11:15 < ws-client> **** it sets a for 0.6 out of range value only for 0.6 11:16 < ws-client> **** i am 90% sure that deleting this code breaks nothing 11:16 < ws-client> **** but cba to test it 11:16 < bridge> No 11:17 < bridge> That's a part of sixup. 11:17 < bridge> You can't delete it 11:17 < bridge> I have tested if we removed it 🙁 11:18 < bridge> And then I found the 0.7 clients wouldn't get any CNetObj_SoundWorld. 11:18 < ws-client> **** well then i dont get it :D 11:18 < ws-client> **** 0.7 should not depend on m_aItemSizes if there is also m_aItemSizes7 11:19 < bridge> m_aItemSizes7 is used for the client 11:19 < ws-client> **** aaaa 11:19 < bridge> m_aItemSizes is used for the server sixup 11:19 < bridge> idk why 11:19 < ws-client> **** i see 11:19 < ws-client> **** so passing the bool is a bit funny 11:20 < ws-client> **** and doing it on tick too 11:20 < ws-client> **** can probably be done once on startup 11:20 < ws-client> **** i assume this is the if statement that uses the value https://github.com/ddnet/ddnet/blob/c6be37c78228932d2673130d508301fa8730ee2c/src/engine/shared/snapshot.cpp#L338 11:21 < bridge> oh 11:21 < bridge> Oh I got it. 11:22 < bridge> A comment from vanilla 0.7 code 11:22 < bridge> ``` 11:22 < bridge> // HACK: only set static size for items, which were available in the first 0.7 release 11:22 < bridge> // so new items don't break the snapshot delta 11:22 < bridge> ``` 11:22 < ws-client> **** ye thats the thing i mentioned earlier 11:22 < ws-client> **** thats four the race stuff tho right? 11:22 < ws-client> **** not sound world and damage 11:23 < bridge> I think it was here: 11:23 < bridge> ``` 11:23 < bridge> const bool IncludeSize = pCurItem->Type() >= MAX_NETOBJSIZES || !m_aItemSizes[pCurItem->Type()]; 11:23 < bridge> ``` 11:23 < bridge> Merry Christmas 🎄 🎁 11:24 < bridge> Oh 11:24 < bridge> The client must got the size of CNetObj_SoundWorld 11:24 < bridge> in the delta pack 11:25 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1453332736197656668/image.png?ex=694d1115&is=694bbf95&hm=b8260ce5a68de0f42dfbd8b920205105cc27199076320df3884bb983c3d83ae3& 11:26 < bridge> @kebscs can we close #10505 ? 11:26 < bridge> https://github.com/ddnet/ddnet/pull/10505 11:26 < bridge> Yeah 11:26 < bridge> That was it 11:26 < bridge> You must send the size of NetObj in the snap delta. 11:26 < bridge> ``` 11:26 < bridge> 11:26 < bridge> int ItemSize; 11:26 < bridge> const short *pItemSizes = Sixup ? m_aItemSizes7 : m_aItemSizes; 11:26 < bridge> if(Type < MAX_NETOBJSIZES && pItemSizes[Type]) 11:26 < bridge> ItemSize = pItemSizes[Type]; 11:27 < bridge> else 11:27 < bridge> { 11:27 < bridge> if(pData + 1 > pEnd) 11:27 < bridge> return -103; 11:27 < bridge> if(*pData < 0 || (size_t)*pData > std::numeric_limits::max() / sizeof(int32_t)) 11:27 < bridge> return -204; 11:27 < bridge> ItemSize = (*pData++) * sizeof(int32_t); 11:27 < bridge> } 11:27 < bridge> ``` 11:27 < bridge> If you have a better solution 11:28 < bridge> Wait a minute 11:28 < bridge> Oh 11:29 < bridge> You shouldn't pack the size of NetObj in the snap delta( 11:29 < bridge> :thonk: 11:30 < bridge> If you send the size of CNetObj_SoundWorld, the client wouldn't trigger 11:30 < bridge> ``` 11:30 < bridge> ItemSize = (*pData++) * sizeof(int32_t); 11:30 < bridge> ``` 11:30 < bridge> Then it would unpack failed. 11:30 < bridge> :frozen: 11:30 < bridge> Teeworlds magic. 11:36 < bridge> @swarfey i punted this down the road a bit but i think i made a mistake somewhere adding the new types to client.ts: https://github.com/kaitlynia/teeworlds-library-ts/blob/d6a0d0e5db279e87449b2de0b08e48a15c4e268b/lib/client.ts#L27C509-L27C562 11:36 < bridge> (ie. `"SV_TEAMS_STATE", "CL_SHOW_OTHERS_LEGACY"` were already there but they may not be in the right place?) 11:36 < bridge> if you're open to review i appreciate it ^^ 11:36 < bridge> gn 11:42 < bridge> LOL gemini 3 pulls up ddnet testing logs xD 11:43 < bridge> https://ddnet.org/testlogs/show/Bouncy#:~:text=yea,01%2F2024%208%3A50%20PM 11:43 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1453337207703212198/image.png?ex=694d1540&is=694bc3c0&hm=8dc7c848cb243242d5521ba3dbdbc82cb6b607f7e739e98ad2c42701f6a52405& 11:43 < bridge> XDDDDDD 11:43 < bridge> $decline 11:43 < bridge> This command was not found. 11:49 < ws-client> **** @teero777 is that public info? or did discord sell the data? 11:49 < bridge> the logs are public 11:50 < bridge> no idea how it has that link though 11:51 < bridge> google scraping 11:51 < bridge> I wonder that 11:51 < bridge> Do we have any test on big endian? 11:51 < bridge> i guess 11:52 < bridge> the others suggested putting it into a snap message, that's why I asking, isn't the current PR fundamentally flawed? 11:52 < bridge> gemini is made by google right? 11:52 < bridge> yea, 11:52 < bridge> yea 11:52 < bridge> yea google prolly has the page indexed 11:52 < bridge> and just scraped everything 11:53 < ws-client> **** @remakepower in ddnet yes 11:53 < ws-client> **** search for ARCH_ENDIAN 11:53 < bridge> I means test 11:53 < ws-client> **** for example here https://github.com/ddnet/ddnet/blob/c6be37c78228932d2673130d508301fa8730ee2c/src/engine/shared/datafile.cpp#L1064-L1081 11:53 < ws-client> **** oh tests 11:53 < ws-client> **** not sure 11:53 < bridge> I knowed that we have ARCH_ENDIAN from vanilla teeworlds 11:54 < bridge> ddnet.org/testlogs 11:54 < bridge> But discord prolly selling data too anyways 11:54 < bridge> But I found we didnt't upgrade endian-related code to C++20 std::endian 12:08 < bridge> It works fine 12:08 < bridge> And is full client side 12:11 < bridge> This is not a duplicate imo 12:15 < bridge> yeah those arent dupes. the two listed in it are dupes though 12:17 < bridge> Isn't it better to close old issues for new ones 12:17 < bridge> For visibility 12:20 < bridge> Entity automapper is probably the next thing ill work on when I do more new tclient features 12:21 < bridge> Entity automapper? 12:22 < bridge> Do you know what automapper is? 12:22 < bridge> For editor 12:22 < bridge> I knowed automapper and auto rules 12:22 < bridge> but I didn't understand what is entity automapper 12:23 < bridge> Same idea for entities? 12:23 < bridge> entities layer? 12:23 < bridge> Yes? 12:24 < bridge> It puts design on entities 12:25 < bridge> Could you give me a example? 12:26 < bridge> I could't imagine what it is used for. 12:26 < bridge> It doesn't exist yet 12:26 < bridge> I couldn't imagine what it is used for. 12:26 < bridge> Yeah 12:27 < bridge> I mean, what will it be used for? 12:28 < bridge> :thonk: 12:28 < bridge> To put design on entities :justatest: 12:29 < bridge> So we can fully remove all design in 2026 and have everyone just play w their own designs 12:30 < bridge> Most people already live in this reality 12:30 < bridge> Oh 12:31 < bridge> tc outlines with extra steps 12:31 < bridge> :thonk: 12:32 < bridge> yeah im not asleep yet, smack me with a fucking 2x4 board 12:32 < bridge> So 12:33 < bridge> the normal automapper 12:33 < bridge> yeah i wonder if anyone will actually use entiry automapper other than to remove the inner lines between blocks 12:33 < bridge> is for putting tiles. 12:34 < bridge> And 12:35 < bridge> sorry I still didn't understand what entity automapper is. 12:35 < bridge> :frozen: 12:36 < bridge> entity automapper is a bad name for it anyway. it implies it's mapping something in the file itself. just imagine you're using entities only and your game just "hallucinates" some design on top that isn't part of the map. thats the idea (I think) 12:37 < bridge> its possible I'm misunderstanding it too tho 12:38 < bridge> I have thought that entity automapper is a formatter. 12:38 < bridge> which could clean the rotation of your game tiles. 12:38 < bridge> But it seems not. 12:39 < bridge> However, I still didn't understand 🙁 12:39 < bridge> i just have to assume tater doesn't mean the editor cus that already exists 12:39 < bridge> I don't know why that 12:40 < bridge> game layer, tele layer, switch layer, and front layer are entities layers. 12:40 < bridge> I always think entities layers is a layer contains hundreds of CEntity. 12:41 < bridge> :frozen: 12:42 < bridge> they are not entities. 12:42 < bridge> they are just tiles. 12:42 < bridge> sets of tiles. 12:42 < bridge> :thonk: 12:44 < bridge> pretty good point. too bad they called design tiles already 12:45 < bridge> Also I don't know why we have 12:45 < bridge> ``` 12:45 < bridge> LAYERTYPE_FRONT, 12:45 < bridge> LAYERTYPE_TELE, 12:45 < bridge> LAYERTYPE_SPEEDUP, 12:45 < bridge> LAYERTYPE_SWITCH, 12:45 < bridge> LAYERTYPE_TUNE, 12:45 < bridge> ``` 12:46 < bridge> And `LAYERTYPE_GAME` is not unused 12:46 < bridge> but we have a comment: 12:46 < bridge> ` LAYERTYPE_GAME, // unused` 12:46 < bridge> (it's unused in the vanilla teeworlds) 12:47 < bridge> So we just use that `LAYERTYPE`s for our editor. 12:48 < bridge> you should be able to specify any number of layers. and smaller layers (like speedup, tele, and tune) should have been part of the same "misc" grid. but meh 12:49 < bridge> And we have 12:50 < bridge> ``` 12:50 < bridge> 12:50 < bridge> LAYERTYPE_SOUNDS_DEPRECATED, // deprecated! do not use this, this is just for compatibility reasons 12:50 < bridge> LAYERTYPE_SOUNDS, 12:50 < bridge> ``` 12:51 < bridge> And those types are LAYERTYPE_TILES in the map file. 12:54 < bridge> 3 years ago, I didn't know why we have 12:54 < bridge> ``` 12:54 < bridge> int m_Tele; 12:54 < bridge> int m_Speedup; 12:54 < bridge> int m_Front; 12:54 < bridge> int m_Switch; 12:54 < bridge> int m_Tune; 12:54 < bridge> ``` 12:54 < bridge> today, I still don't know why 🙁 12:55 < bridge> I think we can use `m_Data` instead, which is only used by GameLayer. 12:56 < bridge> But we need to keep back compat now :3 13:04 < bridge> because in teeworlds there was only a game layer and everything was layertype tiles or layertype quads 13:04 < bridge> no 13:04 < bridge> Gamelayer is LAYERTYPE_TILE, too 13:04 < bridge> Gamelayer is LAYERTYPE_TILES, too 13:04 < bridge> read my message again 13:05 < bridge> Oh 13:05 < bridge> Yeah 13:05 < bridge> You are right. 13:05 < bridge> No 13:05 < bridge> Wait 13:05 < bridge> Read my message again :3 13:06 < bridge> What I said is `LAYERTYPE_GAME is not unused` 13:06 < bridge> You must know, some layers like speedup or switch have bigger tiles, and thus another memory layout 13:07 < bridge> Hm 13:07 < bridge> Yes 13:07 < bridge> And then? 13:08 < bridge> Oh 13:08 < bridge> then you can read the map format for this layers idk what your goal is 13:08 < bridge> You means we need to have a backcompat with vanilla clients 13:09 < bridge> yes 13:09 < bridge> :thonk: 13:10 < bridge> I am just trying to explain why things are how they are 13:10 < bridge> I see 13:10 < bridge> ``` 13:10 < bridge> 13:10 < bridge> CTile *pEmptyTiles = (CTile *)calloc((size_t)pLayerTiles->m_Width * pLayerTiles->m_Height, sizeof(CTile)); 13:10 < bridge> mem_zero(pEmptyTiles, (size_t)pLayerTiles->m_Width * pLayerTiles->m_Height * sizeof(CTile)); 13:10 < bridge> Item.m_Data = Writer.AddData((size_t)pLayerTiles->m_Width * pLayerTiles->m_Height * sizeof(CTile), pEmptyTiles); 13:10 < bridge> free(pEmptyTiles); 13:10 < bridge> ``` 13:11 < bridge> yes, a CSpeedupTile is bigger for example 13:11 < bridge> so you have more bytes 13:12 < bridge> :frozen: 13:47 < bridge> "SV_TEAMS_STATE", "CL_SHOW_OTHERS_LEGACY" are both messages that have been deprecated and moved to NetMessageEx later on 13:48 < bridge> i think my library was created at times where they were not deprecated yet, which is why SV_TEAMS_STATE doesnt have legacy behind it yet. in official ddnet they are called legacy now as well: 13:49 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1453368931564654672/image.png?ex=694d32cb&is=694be14b&hm=21a219d07c5d118a9007e57aac32a9ecc47a15ac94b863356823151c5ea2d516& 13:51 < bridge> for netmessages with UUID's (thats all NetMessageEx) you would need to register the uuids here: https://github.com/kaitlynia/teeworlds-library-ts/blob/d6a0d0e5db279e87449b2de0b08e48a15c4e268b/lib/client.ts#L207 13:52 < bridge> something like this ` this.UUIDManager.RegisterName("sv-vote-option-group-end@netmsg.ddnet.org", NETMSG.System.svvoteoptiongroupend);` should work for the messages to be parsed correctly by the library 13:55 < bridge> the messageTypes array that you changed in your version is only used for normal NetMessages without UUIDs. i dont think its actually used anywhere but to make logs look nicer (so you dont have to double check which message is which with the enums) 13:57 < bridge> i think my library was created at times where they were not deprecated yet, which is why SV_TEAMS_STATE doesnt have legacy behind it yet. in official ddnet they are called legacy now as well. but the message id's are still reserved for these deprecated messages, so they are at the correct spot: 14:34 < bridge> ``` 14:34 < bridge> if(g_Config.m_SvRegisterCommunityToken[0]) 14:35 < bridge> { 14:35 < bridge> if(g_Config.m_SvFlag != -1) 14:35 < bridge> { 14:35 < bridge> JsonWriter.WriteAttribute("country"); 14:35 < bridge> JsonWriter.WriteIntValue(g_Config.m_SvFlag); // ISO 3166-1 numeric 14:35 < bridge> } 14:35 < bridge> } 14:35 < bridge> ``` 14:35 < bridge> I don't understand why there is a check for sv_register_community_token here? 14:35 < bridge> ```cpp 14:35 < bridge> if(g_Config.m_SvRegisterCommunityToken[0]) 14:35 < bridge> { 14:35 < bridge> if(g_Config.m_SvFlag != -1) 14:35 < bridge> { 14:35 < bridge> JsonWriter.WriteAttribute("country"); 14:35 < bridge> JsonWriter.WriteIntValue(g_Config.m_SvFlag); // ISO 3166-1 numeric 14:35 < bridge> } 14:35 < bridge> } 14:35 < bridge> ``` 14:35 < bridge> I don't understand why there is a check for sv_register_community_token here? 15:18 < bridge> :frozen: 15:18 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1453391281253388391/image.png?ex=694d479c&is=694bf61c&hm=af549463191576c2060bb0a8715b650ce156e8b67875767f3fd76fab93089549& 15:55 < bridge> STOP FINDING THESE THINGS 15:55 < bridge> actively ruining my christmas spirit ong 15:57 < bridge> idk, big tech just doesn't pay attention to detail 15:57 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1453401193543110717/image.png?ex=694d50d7&is=694bff57&hm=a9b77b4c27d6c8627e3570b58148c5332ff6e5d3233b95f06758cf32f5360cae& 15:57 < bridge> actually you know what 15:57 < bridge> fuck u 15:57 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1453401210034851981/image.png?ex=694d50db&is=694bff5b&hm=9ec9db8aef75ecbe35e11b357c7ab3653329f900ba2962f2998d8daa88d4b5ba& 15:57 < bridge> XD 16:00 < bridge> I have this theory that nobody takes pride in their work anymore. I could not possibly sleep if my work looked like that 16:01 < bridge> same 16:02 < bridge> im currently debugging my particle system for frametee and there is a bug that is 99% not noticeable where when reversing in slowmo and looking at ninja powerup shine particles they sometimes dissapear. im not gonna push a release with that lol 16:10 < bridge> Hi, I was banned for accidentally using a VPN. Can you tell me how to fix this? 16:11 < bridge> #✉-create-a-ticket 16:11 < bridge> admin-mail i think? 16:11 < bridge> admin mail i think? 16:11 < bridge> ban apeal ticket 16:14 < bridge> You can just turn off the VPN and you'll be fine, those bans are for the ip, nothing else 16:15 < bridge> oh i mis understood the question 16:16 < bridge> I tried to turn off the VPN and log into the server, but it didn't help. 16:32 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1453410085761187901/20251224202444_1.jpg?ex=694d591f&is=694c079f&hm=f9f90cb004a4359e2c2db14ad9b1f0351bf92e280df7c711640f59c815988b63& 16:35 < bridge> https://ddnet.org/vpn/ 16:42 < bridge> is this ban forever? 16:46 < bridge> VPNs are generally banned. Disable your VPN then you are not banned anymore. 17:07 < bridge> that's why you're jobless :santatrollet: 17:47 < bridge> chillerdragon: are you here? 18:21 < bridge> what is that? 18:21 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1453437450255990988/Base_Profile_Screenshot_2025.12.24_-_20.20.10.63.png?ex=694d729b&is=694c211b&hm=3f340f992ec3ec3dbad9b869fe4ee0888b4a9aba657994f69dde7476203b9480& 18:21 < bridge> i play with steam version every time 18:23 < bridge> i play with steam version all time 18:26 < bridge> # 18:26 < bridge> #✉-create-a-ticket 18:26 < bridge> ban apeal 18:26 < bridge> thanks 20:59 < bridge> good mornyan just woke up 21:00 < bridge> thanks Swarfy ill finish the PR today 21:21 < bridge> this could be a CSS rendering bug technically. this is an issue on random browsers, when it really SHOULD appear flush but there's a rounding issue with the pixels. 21:22 < bridge> i wish they could all agree about how to treat rounding 21:22 < bridge> it's also a problem with relative units i think 22:48 < bridge> @milkeeycat: here 22:50 < bridge> as a possible solution for `DDNetMessageKind` in `packer.h`, what do you think about moving `ddnet_packer_init_msg` into `message.h`? 22:50 < bridge> chillerdragon ^ 22:52 < bridge> my muscle memory to type nano is pissing me off 22:52 < bridge> im going to have to alias nano to micro 22:53 < bridge> oh i heard about micro, but never used it 22:53 < bridge> micro is really sweet 22:53 < bridge> ive been using it for a couple weeks now 22:53 < bridge> it just does all the things nano should have 22:54 < bridge> buffers are tabs by default, you can drag click to select like a GUI notepad 22:54 < bridge> oh yeah it looks sweet indeed 22:54 < bridge> plugins seem capable, lua system like nvim 22:54 < bridge> i dont usually like to use language servers though just highlighting 22:55 < bridge> ye was gonna say, builtin semantic highlightning too - cool 22:55 < bridge> i used a LOT of terminal editors, but i usually stick with nvim for quick and dirty edits and fallback to emacs/vscode for bigger projects 22:55 < bridge> it removes trailing whitespace as you blank lines and skip them, which i thought was nice 22:55 < bridge> not just when you save 22:56 < bridge> the bracket matching seems smart enough, but knowing when you make a pair of brackets or not is incorrect sometimes 22:57 < bridge> i dont doubt that using a proper language server would fix this problem 23:01 < bridge> @milkeeycat: that is then a packer function not in the packer header I don’t think it will be found if needed 23:01 < bridge> Both are meh but I feel like mine is less meh 23:04 < bridge> I don't really think it belongs to packer, yes it takes `DDNetPacker` as an argument but it works with message kind(packer has nothing to do with message kinds), you did the same for snapshots, `ddnet_decode_snapshot` takes `DDNetUnpacker` but the function is defined in `snapshot.h`, not `packer.h`. 23:04 < bridge> I see 23:04 < bridge> It’s past my working hours tho 23:05 < bridge> Can you repost this on GitHub and I will have a look tomorrow :) 23:18 < bridge> Score broken again??? 23:42 < bridge> is WHISPER_SEND not acked? 23:42 < bridge> (by the server)