00:05 < bridge> `-pie` is such a flag 00:57 < bridge> chillerDragon: this packet was sent by the server? 00:57 < bridge> ack -> 2052 00:57 < bridge> it contains 2 chunks 00:58 < bridge> first chunk is vital with sequence 7, game message id 3 00:58 < bridge> second chunk is a snap single , so no sequence number 00:58 < bridge> currentTick 5210 00:58 < bridge> deltaTick 5211 00:59 < bridge> crc 1536533683 00:59 < bridge> size 95 bytes 00:59 < bridge> snap payload size 95 bytes 01:01 < bridge> can you check for me? 01:01 < bridge> pie 01:03 < bridge> the entire snap chunk payload: 01:03 < bridge> 01:03 < bridge> ``` 01:03 < bridge> \x9A\x51\x9B\x51\xB3\x92\xAD\xB9\x0B\x9F\x01\x00\x03\x00\x06\x00\x00\x00\x00\x00\x14\x00\x00\x01\x0B\x00\xDA\xC8\xF0\x91\x02\xCC\xB0\xD0\xB1\x02\xDA\xE8\xD8\xF0\x0B\xFF\xFF\xFB\xF7\x0F\xFF\xFD\xFB\xF7\x0F\xFF\xFD\xFB\xF7\x0F\xFF\xFF\xFB\xF7\x0F\x40\xDE\xE4\xD0\xB1\x03\xFF\xAD\x98\xA1\x01\xFF\xFD\xFB\xF7\x0F\xFF\xFD\xFB\xF7\x0F\xFF\xFD\xFB\xF7\x0F\xFF\xFF\xFB\xF7\x0F\x00\x80\xFE\x07\x80\xFE\x07\x0A\x00\x01\x00\x00\x00\x00 01:03 < bridge> ``` 01:03 < bridge> 01:03 < bridge> only the snap payload (content after size bytes): 01:03 < bridge> 01:03 < bridge> ``` 01:03 < bridge> \x00\x03\x00\x06\x00\x00\x00\x00\x00\x14\x00\x00\x01\x0B\x00\xDA\xC8\xF0\x91\x02\xCC\xB0\xD0\xB1\x02\xDA\xE8\xD8\xF0\x0B\xFF\xFF\xFB\xF7\x0F\xFF\xFD\xFB\xF7\x0F\xFF\xFD\xFB\xF7\x0F\xFF\xFF\xFB\xF7\x0F\x40\xDE\xE4\xD0\xB1\x03\xFF\xAD\x98\xA1\x01\xFF\xFD\xFB\xF7\x0F\xFF\xFD\xFB\xF7\x0F\xFF\xFD\xFB\xF7\x0F\xFF\xFF\xFB\xF7\x0F\x00\x80\xFE\x07\x80\xFE\x07\x0A\x00\x01\x00\x00\x00\x00 01:03 < bridge> ``` 01:04 < bridge> since teeframe is a currently only a server implementation, it only encodes snaps, it cant decode, so I think I cant help much more than this 01:04 < bridge> since its a snap single and not a slice, you sure have the removed items, updated items, and unused 00 at the beginning 01:04 < bridge> so its 0 removed items 01:05 < bridge> 3 updated items 01:05 < bridge> 00 - unused 01:05 < bridge> since there is no removed items, all snap items sent have it item id, id, and payload 01:06 < bridge> first item is 6 - obj_game_info 01:06 < bridge> id is 0 - as obj_game_info id is always zero 01:08 < bridge> since delta tick in this case is current tick - (-1), there is no confirmed snap known by the client 01:09 < bridge> so this snap single payload contains all snaps items and game context the client should be aware of 01:09 < bridge> and because of that, all values are the real values and not the diff from the last delta snap 01:09 < bridge> since delta tick in this case is current tick - (-1), there is no confirmed snap known by the client (delta snap) 01:10 < bridge> since teeframe is currently only a server implementation, it only encodes snaps, it cant decode, so I think I cant help much more than this 01:15 < bridge> jesus, I think I copied the wrong packet 07:08 < bridge> A 08:26 < bridge> chillerdragon: how can i rebase my teeworlds branch to latest community, am little dum =] 08:45 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1215203600448364614/image.png?ex=65fbe58b&is=65e9708b&hm=7351f13cadf512f98fe5a72f1de1272355b0761dd7c195dea08f373e30cabf28& 08:45 < bridge> its llvm 18 time 09:05 < bridge> :owo: 09:05 < bridge> xar 09:51 < bridge> @jupeyy_keks i know ur afk from discord but i enabled lto on gentoo 09:51 < bridge> i forgot to do so 09:51 < bridge> i also enabled o3 on some packages 09:56 < bridge> now u have a fast 09:57 < bridge> oh i just realized thats a bit annoying since its a pr upstream as well then you break your teeworlds pr if you merge it into community 09:59 < bridge> Maybe just pr against community directly from a latest version. 09:59 < bridge> 09:59 < bridge> ``` 09:59 < bridge> git remote add communism https://github.com/teeworlds-community/teeworlds/ 09:59 < bridge> git fetch communism 09:59 < bridge> git checkout community 09:59 < bridge> git checkout -b your_epic_branch_name 09:59 < bridge> ``` 09:59 < bridge> 09:59 < bridge> then add changes there and pull directly here 09:59 < bridge> https://github.com/teeworlds-community/teeworlds/pulls 09:59 < bridge> i might have the mirror bot do that actually to fix the pipeline problem for all branches 10:00 < bridge> so annoying that the merge queue has to pass the pipeline before merge. Does not make much sense to me. The only relevant state is after merge. 10:02 < bridge> btw you dont have to copy paste changes you can just run this 10:02 < bridge> 10:02 < bridge> ``` 10:02 < bridge> git cherry-pick b855a9db2cf0cd8fa6e5f56c68c78a0667d579d5 10:02 < bridge> ``` 10:02 < bridge> 10:02 < bridge> on the new branch and push 10:02 < bridge> do i have to be on teeworld or community-teeworlds? :justatest: 10:03 < bridge> what is "be on" 10:03 < bridge> you can do that from your teeworlds/teeworlds fork its fine 10:03 < bridge> ok 10:03 < bridge> you can do inter fork cross entanglement pullrequests 10:55 < bridge> oh interesting so my parser falsely detected it as map download hmm thanks a lot 11:00 < bridge> no time for that now and will forget later lol. But you can pr or issue all my infra is open source this should be located at zillyhuhn/server-config on github 11:00 < bridge> pls open an issue if you found a bug they get lost in this chat 12:13 < ws-client> > can you give an example of when you'd use multiple cursors? 12:14 < ws-client> @heinrich5991 idk where to start so many times i need multiple cursors 12:14 < ws-client> for example editing this piece of code 12:14 < ws-client> https://zillyhuhn.com/cs/.1709810001.png 12:14 < ws-client> or copy pasting a wall of text and transforming its structure 12:15 < bridge> What would u want to edit in these lines? 12:16 < ws-client> or doing this 12:16 < ws-client> https://zillyhuhn.com/cs/.1709810175.png 12:17 < ws-client> @milkeeycat doesn't matter usually if you want to edit something in those lines its the same for every line. So if you can do word jumps and have a separate clipboard and word boundaries for everyline its amazing 12:18 < ws-client> turn yaml to json etc 12:21 < bridge> Ws Client broken again, reply didnt Work 12:22 < ws-client> what didnt? work? 12:24 < bridge> Up is working - down is Not 12:24 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1215258719554764800/Screenshot_20240307-122354.png?ex=65fc18e1&is=65e9a3e1&hm=c02948b7d5c0e6e88c290eefa73520d384e8ede364394c7f5e1931d7e51fed38& 12:24 < ws-client> one is a reply from matrix the other is from irc which has no replies 12:25 < ws-client> @milkeeycat https://tube.zillyhuhn.com/video.php?t=vscode_multi_cursor.mp4&u=chiller if the function signature changes this could be an example 12:26 < ws-client> with multicursor anything tedious becomes fun 12:26 < ws-client> s/anything/manything/ yes thats a word 12:30 < bridge> 😬 12:30 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1215260398748442654/nvim_rocks.mp4?ex=65fc1a71&is=65e9a571&hm=798bb4758d04c3eb07afead11d16397ed766f606e16b6c69411849b4a9d7a2b3& 12:31 < bridge> chillerdragon 12:33 < ws-client> no doubt you can do every multicursor vscode action in vim 12:33 < ws-client> but it looks more complex to type and also more complex to reason about 12:34 < ws-client> id claim vscode is fast because it requires less keystrokes and less mental capacity 12:34 < ws-client> another common use case is this one @heinrich5991 12:34 < ws-client> https://tube.zillyhuhn.com/video.php?t=vscode_multi_cursor2.mp4&u=chiller 12:35 < bridge> I kinda like writing macros 12:35 < bridge> Its fun xd 12:35 < bridge> But not fun when ut doesn't work first try 12:35 < ws-client> yes multicursor is very forgiving when it comes to mistakes 12:36 < ws-client> undo and corrections and tinkering is smooth 12:37 < ws-client> if its only 2 or 3 lines its so nice because the overhead of multicursor is non existant 12:46 < ws-client> mostly there is a few twists so one fix macro usually doesnt catch all edge cases 12:46 < ws-client> but a few different multi cursors do 12:47 < ws-client> json to yaml 12:47 < ws-client> https://tube.zillyhuhn.com/video.php?t=vscode_multi_cursor3.mp4&u=chiller 12:47 < ws-client> i can do this all day 12:48 < bridge> Send json :santatrollet: 12:48 < ws-client> ```{"name":"John","age":30,"car":null,"foo":"bar","baz":"bang","nob":"cat","skill":420}``` 12:52 < ws-client> @milkeeycat we should compete in some codewars site just reformatting code xd 12:52 < ws-client> is that a thing? 12:52 < bridge> if its not, it can become a thing xd 12:53 < ws-client> for sure i could see this being fun for 5mins getting random snippets pvp'ing a friend first to refactor every tool allowed 12:54 < bridge> chillerdragon in the 0.7 coding competition (he won because hes the only person who ever codes 0.7) 12:54 < ws-client> *pastes into chatgpt5* 12:56 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1215266713768304670/yep.mp4?ex=65fc2053&is=65e9ab53&hm=7fe3024c4790f840214674eaaf5d031fd9a4a95a8cbd5045f5da6fa67f273a50& 12:56 < ws-client> lmao jq 12:56 < ws-client> nice one 12:56 < ws-client> again prime enjoyer detected hehe 12:57 < bridge> Its pretty useful thing 12:58 < ws-client> nice subst 12:58 < ws-client> ye u pro 12:58 < ws-client> but id still claim im faster :p 12:58 < ws-client> i guess we never know 13:00 < bridge> You are faster because you are pro 13:00 < bridge> And me nub 13:00 < ws-client> skill issue? 13:00 < bridge> I dont do that kind of refactoring often 13:00 < bridge> But yea, skill issue 13:03 < ws-client> but using ! is bit chot 13:03 < ws-client> lemme do speedrun using ! xd 13:03 < bridge> U can use bang in vscode 13:06 < ws-client> https://tube.zillyhuhn.com/video.php?t=nvim_moment.mp4&u=chiller 13:07 < bridge> U can do this in vim 13:07 < ws-client> if u need ! to be effective in vim you are basically bash enjoyer not vim enjoyer axaxax 13:08 < bridge> why would i spend 20 mins writing ugly ass regex when i can just use ! :thonk: 13:08 < ws-client> xd 13:08 < ws-client> agree 13:08 < ws-client> i am big bash enjoyer and its no secret 13:08 < ws-client> in bash you dont even need ! 13:08 < bridge> I saw Minecraft server in bash vid 13:09 < bridge> From prime 13:09 < ws-client> ye me too 13:09 < bridge> :kek: 13:09 < bridge> That thing is so cursed :justatest: 13:09 < ws-client> made me think about minetee 13:09 < ws-client> i should learn mc protocol before discussing w heinrich again :D 13:10 < bridge> ah. in vim, I usually use macros for these 13:10 < bridge> I remember they use 9 digits after . For position in one block 13:10 < ws-client> in prime vid the blog mentioned 4 bit per block xd. And the protocol we plan in #7666 has 41 BYTES per tile LMAOOOO 13:11 < ws-client> https://github.com/ddnet/ddnet/issues/7666 13:11 < ws-client> if a minetee creeper explodes the removed tiles are basically ddos xd 13:11 < bridge> ah, looks nice. thanks for the example 🙂 13:29 < bridge> I didn't find a website where u can compete with others by refactoring code, and it goes into my todo project list 13:29 < ws-client> nice 13:30 < bridge> But before that there're two ddnet related projects i have to finish first XD 13:44 < bridge> 🥺 demo webviewer first pls 13:46 < bridge> Did u see that giga cool laggy map? xd 13:48 < bridge> I made a feature to render object containers aaand it just silently doesn't work 13:48 < bridge> No errors, just empty screen 13:48 < bridge> Poggers 13:49 < bridge> https://ddnet.github.io/load_map.html 13:50 < bridge> Oh ye, my demo viewer is completely useless 13:50 < bridge> 👎🏻👎🏻 13:50 < bridge> https://ddnet.github.io 13:50 < bridge> need pure js project 13:50 < bridge> Lmao 13:50 < bridge> :monkalaugh: 13:52 < bridge> ✖️ client wrapper ✖️ 13:53 < bridge> Then add server with ws and send requests from frontend 13:53 < bamcane> wow 13:54 < bamcane> there's a web demo render now?? 13:54 < bridge> just a client ported to web 13:54 < bridge> @chikowitz i did it 😏 13:55 < bamcane> hm 13:55 < bamcane> i couldn't load it, there's only a white screen be displayed 14:16 < bridge> what is it :thonk: 14:17 < bridge> Cant u read? ._. 14:18 < bridge> ye I read ddnet.. 15:21 < bridge> writing types for webgl calls from typless language is so much fun :pepeW: 16:20 < bridge> @learath2 c question 16:21 < bridge> how do u benchmark a function 16:21 < bridge> ```C 16:21 < bridge> clock_t begin = clock(); 16:21 < bridge> 16:21 < bridge> /* here, do your time-consuming job */ 16:21 < bridge> 16:21 < bridge> clock_t end = clock(); 16:21 < bridge> double time_spent = (double)(end - begin) / CLOCKS_PER_SEC; 16:21 < bridge> ``` 16:21 < bridge> is tihs good enough? 16:21 < bridge> time.h 16:21 < bridge> That should be fine but you probably want a high precision time rather than just any time 16:22 < bridge> I would also do it a couple thousand times in a loop and divide 16:23 < bridge> Maybe do it a dozen times or so before you start timing to help the branch predictor. Idk it all depends on how accurate you need to get 16:23 < bridge> @learath2 how can u make sure it doesnt get optimized out 16:23 < bridge> the fn call 16:23 < bridge> does it optimize extern fns? 16:24 < bridge> Put it in a separate TU and it won't be optimized indeed 16:25 < bridge> tu? 16:25 < bridge> ah 16:25 < bridge> the extern fn is from a static lib 16:25 < bridge> my lib compiled from my lang 16:25 < bridge> There is also a compiler attribute you can mark your function with but I don't remember 16:26 < bridge> It it's extern from a static lib you are fine. It can't be optimized out completely unless you use LTO 16:32 < bridge> This sort of micro benchmark on the function level is not very useful unless you already have a theory as to how it will turn out btw 16:34 < bridge> Because of emergent behaviour of compilers it's really hard to extrapolate from microbenchmarks to what happens in an overall program 16:37 < bridge> ye i know 16:37 < bridge> xd 16:38 < bridge> @learath2 tbh this is for the lang im making at work 16:38 < bridge> the boss wants a microbench 16:40 < bridge> Oh btw, careful clock() iirc is the cpu clock. If there is any io or if your cores are contended you will get bad results 16:41 < bridge> You want a quiet system, and you want to use a different source of timing if there is any io involved at all 16:43 < bridge> gm 16:44 < bridge> Or if one solution involves offloading the computation to something that is not the CPU 😄 16:47 < bridge> @learath2 well its more like a regression bench 16:48 < bridge> to know if we lose perf 16:48 < bridge> i guess 17:00 < bridge> The issue I was trying to highlight is that even if you do lose performance at this level, it might not change anything in the overall performance of your program. That's all, but I'm sure your boss already knows that. 17:00 < bridge> yeye 17:01 < bridge> some stuff is more done for marketing than practical uses 17:01 < bridge> too 17:55 < bridge> ```C 17:55 < bridge> #include 17:56 < bridge> #include 17:56 < bridge> #include 17:56 < bridge> #include 17:56 < bridge> #include 17:56 < bridge> 17:56 < bridge> extern uint64_t edlang_function(uint64_t n); 17:56 < bridge> extern uint64_t rust_function(uint64_t n); 17:56 < bridge> 17:56 < bridge> struct timespec timer_start() { 17:56 < bridge> struct timespec start_time; 17:56 < bridge> clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start_time); 17:56 < bridge> return start_time; 17:56 < bridge> } 17:56 < bridge> 17:57 < bridge> long timer_end(struct timespec start_time) { 17:57 < bridge> struct timespec end_time; 17:57 < bridge> clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end_time); 17:57 < bridge> long diffInNanos = (end_time.tv_sec - start_time.tv_sec) * (long)1e9 + 17:57 < bridge> (end_time.tv_nsec - start_time.tv_nsec); 17:57 < bridge> return diffInNanos; 17:57 < bridge> } 17:57 < bridge> 17:57 < bridge> int main(int argc, const char **argv) { 17:57 < bridge> if (argc < 2) { 17:57 < bridge> fprintf(stderr, "missing iteration arguments\n"); 17:57 < bridge> return 1; 17:57 < bridge> } 17:57 < bridge> 17:57 < bridge> if (argc < 3) { 17:57 < bridge> @learath2 behold my C program 18:14 < bridge> https://github.com/llvm/llvm-project/pull/83992 18:14 < bridge> another pr merged into llvm 18:15 < bridge> this one way bigger 18:15 < bridge> got already more pr ideas 18:48 < bridge> not enough ub 18:59 < bridge> linux enjoyers, pls send help, why my sed not working :Zzz_7062057890308424505: 18:59 < bridge> 18:59 < bridge> ```bash 18:59 < bridge> paul@ubuntu-hp:~/test2$ cat random2.cfg | grep password 18:59 < bridge> password: "superduperpass" 18:59 < bridge> paul@ubuntu-hp:~/test2$ sed -i 's/password:.{0,}/password:asd/g' random2.cfg 18:59 < bridge> paul@ubuntu-hp:~/test2$ cat random2.cfg | grep password 18:59 < bridge> password: "superduperpass" 18:59 < bridge> ``` 19:03 < bridge> thanks a lot 19:03 < bridge> yes 19:04 < bridge> it works 19:04 < bridge> with -E 19:04 < bridge> as i said 19:04 < bridge> ``` 19:04 < bridge> ❯ sed -E 's/password:.{0,}/password: asd/' a 19:04 < bridge> password: asd 19:04 < bridge> ``` 19:04 < bridge> -E enables fancier regex 19:04 < bridge> sed is ancient 19:04 < bridge> :justatest: not listed on `man sed` 19:04 < bridge> oh ok it does 19:04 < bridge> ``` 19:04 < bridge> ❯ sed --help | rg E 19:04 < bridge> -E, -r, --regexp-extended 19:04 < bridge> (for portability use POSIX -E). 19:04 < bridge> E-mail bug reports to: . 19:04 < bridge> ``` 19:04 < bridge> xd 19:39 < bridge> idk why i read it as 19:39 < bridge> > sex doesn’t usually work in regex mode 19:40 < bridge> also true 19:40 < bridge> xd 21:31 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1215396496132931604/GIFbJgXWMAAj-tt.png?ex=65fc9931&is=65ea2431&hm=35927174e3ef2b86461ae3e2e3a5e938b86eb1aa383ff9427dad9507b05b0f4a& 22:09 < bridge> i'm trying to cross compile from fedora to windows, you guys ever got this error? 22:09 < bridge> 22:09 < bridge> ``` 22:09 < bridge> CMake Error at cmake/FindSSP.cmake:12 (message): 22:09 < bridge> could not find ssp paths 22:09 < bridge> Call Stack (most recent call first): 22:09 < bridge> CMakeLists.txt:544 (find_package) 22:09 < bridge> ``` 22:12 < bridge> On Windows this error message usually means ddnet-libs are missing or not updated. I don't know how to get the ssp lib for cross compiling though. 22:12 < bridge> I got it here `/usr/x86_64-w64-mingw32/sys-root/mingw/bin/libssp-0.dll` but it seems like it doesn't see it 22:13 < bridge> Take a look at `FindSSP.cmake` 22:14 < bridge> ye I tried fixit it like this (without comments) 22:14 < bridge> ``` 22:14 < bridge> #set(SSP_COPY_FILES 22:14 < bridge> #"/usr/x86_64-w64-mingw32/sys-root/mingw/bin/libssp-0.dll" 22:14 < bridge> ``` 22:14 < bridge> but it didnt do it 22:14 < bridge> i was hoping someone got it before and someone knew quick fix xd, but if not, imma do more gpt4-ing xd 22:16 < bridge> Did you try cloning ddnet-libs already and building with precompiled libs or does that not work? 22:17 < bridge> nope, haven't tried, imma try 22:20 < bridge> haha, worked, thanks ❤️ 22:39 < bridge> ```CMake Error (dev) at debug/googletest-src/googletest/cmake/internal_utils.cmake:239 (find_package): 22:39 < bridge> Policy CMP0148 is not set: The FindPythonInterp and FindPythonLibs modules 22:39 < bridge> are removed. Run "cmake --help-policy CMP0148" for policy details. Use 22:39 < bridge> the cmake_policy command to set the policy and suppress this warning. 22:39 < bridge> 22:39 < bridge> Call Stack (most recent call first): 22:39 < bridge> debug/googletest-src/googletest/CMakeLists.txt:84 (include) 22:39 < bridge> This error is for project developers. Use -Wno-error=dev to suppress it.``` 22:39 < bridge> Any idea how to fix this in GH actions? 22:43 < bridge> #6913 22:43 < bridge> https://github.com/ddnet/ddnet/pull/6913 22:44 < bridge> thanks 23:10 < bridge> @gerdoe you're such a chad sometimes 23:10 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1215421440417996840/image.png?ex=65fcb06c&is=65ea3b6c&hm=99eaf3185670b406ce708b20f6b55ed5221fc73216f571054f22727012038711& 23:19 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1215423511343136768/h427xhy14umc1.png?ex=65fcb25a&is=65ea3d5a&hm=22a1a7af1fc12ba301475b999cd1f12f9709e44b614270dda9798107c1287ee0& 23:28 < bridge> ``` 23:28 < bridge> 2024-03-07 22:51:10 I assert: /home/deen/isos/ddnet/ddnet-source/src/base/system.cpp(4587): Invalid UTF-8 passed to windows_utf8_to_wide 23:28 < bridge> 2024-03-07 22:51:10 I assert: /home/deen/isos/ddnet/ddnet-source/src/base/system.cpp(4587): Invalid UTF-8 passed to windows_utf8_to_wide 23:28 < bridge> ``` 23:28 < bridge> 23:28 < bridge> this one's interesting, what could've caused this? - our map has a graphical issue, but i dont think its related is it?: 23:28 < bridge> 23:28 < bridge> 23:28 < bridge> `2024-03-07 22:51:10 I Warning: The width of texture "embedded: 5" is not divisible by 16, or the height is not divisible by 16, which might cause visual bugs.` 23:30 < bridge> i got this sent to by a player, he said joining other servers/maps works fine - and we currently have 20 players without any issues 23:32 < bridge> update: redownloading the map helps, but im still curious as to why that happens/happened 23:33 < bridge> This was a bug a while ago where loading the map into the editor and then saving it would corrupt the images right? 23:33 < bridge> Are you on the newest version? 23:34 < bridge> oh it didnt happen for me, it was a player on our server, and redownloading the map fixed the issue - he was on latest release 23:34 < bridge> Hmm okay 23:34 < bridge> Weird 23:35 < bridge> ye i couldnt connect the dots on this one :D 23:35 < bridge> Maybe his network gave up on him a ripped a few packets outta there 23:40 < bridge> If it happens again, copy the corrupted map and send it please. Invalid UTF-8 in image/sound names should already be checked with latest client though. Checks for invalid layer/group/envelope names will be added by the PR I just opened. 23:40 < bridge> Did this happen on an official DDNet server? 23:41 < bridge> it happened on a teeworlds mod with latest ddnet 23:43 < bridge> Maybe it was the skin name related crash, which should be fixed on the client side by the PR above and on the server-side on DDNet and KoG servers already 23:44 < bridge> hmm maybe, i'll drop the stuff in here when it happens again and i cant figure it out myself! 23:46 < bridge> If you use Windows you should have a crash log (`.RTP` file), which should tell where the invalid UTF-8 comes from