01:24 < bridge_> chillerdragon: got smarter on this issue? i'd like to fix this aswell - it's annoying having this everywhere 01:24 < bridge_> 01:24 < bridge_> ``` 01:24 < bridge_> 2025-04-13 01:20:16 I account: saving account 'meloƞ' CID=0 AccountId=1 Logout=1 01:24 < bridge_> 2025-04-13 01:20:16 T game: kill killer='0:meloƞ' victim='0:meloƞ' weapon=-3 special=0 01:24 < bridge_> 2025-04-13 01:20:16 I chat: *** 'meloƞ' has left the game 01:24 < bridge_> 2025-04-13 01:20:16 I game: leave player='0:meloƞ' 01:24 < bridge_> 2025-04-13 01:20:16 I mysql: can't free last result (free_result:stmt:5025): Statement has no result set 01:25 < bridge_> 2025-04-13 01:20:16 I sql: [8] save user done on read database 0 01:25 < bridge_> 2025-04-13 01:20:16 I mysql: can't free last result (free_result:stmt:5025): Statement has no result set 01:25 < bridge_> 2025-04-13 01:20:16 I sql: [9] logout user done on read database 0 01:25 < bridge_> ``` 01:34 < bridge_> ```File "\scripts\languages\twlang.py", line 58, in check_file 01:34 < bridge_> matches = re.findall(r"(Localize|Localizable)\s*\(\s*\"((?:(?:\\\")|[^\"])+)\"(?:\s*,\s*\"((?:(?:\\\")|[^\"])+)\")?\s*\)", fileobj.read()) 01:34 < bridge_> ~~~~~~~~~~~~^^ 01:34 < bridge_> File "", line 325, in decode 01:34 < bridge_> UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe0 in position 1056: invalid continuation byte``` 01:34 < bridge_> why does this happen? 01:34 < bridge_> trying to execute anaylze.py 01:34 < bridge_> the other scripts also seem to be broken for me for some reason 01:36 < bridge_> ah, utf-8-sig i think 01:41 < bridge_> ah, no, some weird character 01:45 < bridge_> windows doesnt like italian letters or french i think 02:48 < ws-client> yea no idea melon 07:14 < bridge_> hello all, lmk if you have any tips- I'm bad with toolchain stuff 07:14 < bridge_> 07:14 < bridge_> CMake configure said "using bundled" for a couple of things, but then the exe says it cant find dlls (libfreetype, SDL2, libpng16-16, avformat-61). 07:14 < bridge_> 07:14 < bridge_> Are these found in the ddnet-libs submodule somewhere or should they be installed in my system already somehow 07:16 < bridge_> `git submodule update —init —recursive` will bring ddnet libs in (yes that’s where u get it btw) 07:17 < bridge_> idk what package manager you use but i usually install the libs that way 07:19 < bridge_> hm, well it seems like my ddnet-libs is up to date but cmake isn't getting the libs 08:55 < bridge_> ok ignore what I said before, the dependencies are all being built properly but the exe lands in build/debug but the dlls are in build/ 08:56 < bridge_> am I supposed to be copying everything into one place? or should I change cmake build type to not be debug? 10:51 < bridge_> honeypot on 8303? 10:55 < bridge_> @0xdeen btw. fix master please if you are online 10:55 < bridge_> can't put my PRs on draft with GH app :/ 11:59 < bridge_> @hokepoke: how do you build? 12:08 < bridge_> I remember this, and I talked with Robyt3 about it. It's something that happens when you use the msvc tool chain and something we wanted to look at so everything is properly placed in the correct directory. I didn't find a way to do so yet so I, out of spite switched to gnu using msys2 :monkalaugh: 12:09 < bridge_> I remember this, and I talked with Robyt3 about it. It's something that happens when you use the msvc tool chain and something i wanted to look at so everything is properly placed in the correct directory. I didn't find a way to do so yet so I, out of spite switched to gnu using msys2 :monkalaugh: 12:13 < bridge_> @0xfaulty did you see my wire message? 12:14 < bridge_> @0xfaulty: 12:14 < bridge_> @0xfaulty ^ 12:14 < bridge_> Argh 13:09 < bridge_> When testing with MSVC I build with `DEV=OFF` so I also get the package folders like `pack_DDNet-19.2-win64_zip` which are ready to use 13:39 < bridge_> Does anyone know how I can tell gcc to create a lookup table for a switch Statement? 13:44 < bridge_> Hmm afaik the compiler selects this automatically 13:51 < bridge_> Trust the compiler 13:51 < bridge_> unless you are super pro 14:01 < bridge_> I wonder how it handles default for lookup optimization 14:15 < bridge_> if default can never happen use __builtin_unreachable so you allow the compiler to make a lookup table 14:15 < bridge_> or whatever is equivalent in c++ 14:16 < bridge_> else the compiler won't make a lookup table afaik. because it can never know what values the switch number can have. 14:23 < bridge_> perfekt, this is what I was looking for 👍 thx 14:39 < bridge_> else the compiler won't make a lookup table. because it can never know what values the switch number can have. 14:45 < bridge_> Teero: 10x engineer 14:46 < bridge_> literally 14:48 < bridge_> gdb is weird - i wanted to debug an entirely differen crash happening in my code, i run gdb, place a breakpoint, and suddenly it segfaults on clientEnter 14:48 < bridge_> running it without gdb in both debug and release doesnt crash 14:48 < bridge_> i hate this game 14:49 < bridge_> looks like you have ub but it only actually causes a crash when you use gdb 14:49 < bridge_> looks like you have UB but it only actually causes a crash when you use gdb 14:50 < bridge_> @blaiszephyr you should probably do a asan/ubsan run xd 14:50 < bridge_> :( 14:50 < bridge_> Hey @essigautomat , why can’t I move in the direction of the arrow? Both force and max speed are set to 1. Is this the expected behavior? 14:50 < bridge_> https://cdn.discordapp.com/attachments/293493549758939136/1360960311469015040/simplescreenrecorder-2025-04-13_20.37.23.mp4?ex=67fd048f&is=67fbb30f&hm=0f6ef7959d02b63bdfca01ac2f8c71263ed9bc2491370e8a0c61f25da57a1717& 14:51 < bridge_> are these the new speeders? i thought they looked different 14:51 < bridge_> are these the new speeders? i thought they looked different than the normal ones 14:52 < bridge_> Yes, they're new speeders. And I can move in the old one. 14:57 < bridge_> you are moving but very slowly, with speed of 1 14:57 < bridge_> as you said theyre max speed 1 15:10 < bridge_> Setting max speed to 2 still doesn’t allow movement, but setting it to 3 works. Is there really such a big difference in speed between the two? 15:10 < bridge_> https://cdn.discordapp.com/attachments/293493549758939136/1360965256360235121/simplescreenrecorder-2025-04-13_21.05.07.mp4?ex=67fd092a&is=67fbb7aa&hm=53890662f2a7d40990bafb277ee6437aff64acb259feafbc1f47409195bd8b0b& 15:10 < bridge_> it is probably a quantization issue 15:10 < bridge_> Setting max speed to 2 still doesn’t allow movement, but setting it to 3 works. Is there really such a big difference in speed between the two? 15:10 < bridge_> Does it crash in gdb even if you dont set a breakpoint? This is really never supposed to happen with how gdb is designed 15:11 < bridge_> Setting max speed to 2 still doesn’t allow movement, but setting it to 3 works. Is there really such a big difference in speed between the two? 15:11 < bridge_> (sorry, uploaded a invalid attachment) 15:11 < bridge_> Even with a breakpoint it's not really supposed to happen. Gdb freezes all threads at the same time. So even the relative timings shouldnt change 15:12 < bridge_> gdb might offset the stack no? this might lead to UB actually crashing instead of modifying something unknowingly 15:12 < bridge_> gdb might offset the memory no? this might lead to UB actually crashing instead of modifying something unknowingly 15:13 < bridge_> https://cdn.discordapp.com/attachments/293493549758939136/1360966126309343422/simplescreenrecorder-2025-04-13_21.11.40.mp4?ex=67fd09fa&is=67fbb87a&hm=8357ae1b967b52870f0789688542b8dd113677f3a52cfc0608376b2b64b60165& 15:14 < bridge_> maybe 15:14 < bridge_> Offset? I don't think it should be touching the memory at all. Aslr does move things around every launch, but it shouldn't consistently only crash in gdb 15:14 < bridge_> Let me try to think of something gdb influences 15:15 < bridge_> its funny, the function in itself was broken but didnt crash when running without gdb 15:16 < bridge_> gdb basically just told me the function is broken 15:16 < bridge_> but why does it run without 15:16 < bridge_> Software watchpoints slow down execution I guess. That could do it 15:16 < bridge_> the function was called which tried accessing invalid memory, but it still executes and doesnt segfault 15:16 < bridge_> so weird 15:16 < bridge_> Conditional breakpoints also slow down execution but gdb shouldn't ever make them itself if you arent using a plugin or sth 15:16 < bridge_> @blaiszephyr exactly as i said :nouis: 15:16 < bridge_> So running it outside gdb accessing invalid memory worked fine? 15:17 < bridge_> yes xD 15:20 < bridge_> I really do not remember gdb touching the stack, it just spawns a normal process then uses the kernel to attach to it remotely 15:20 < bridge_> Weird 15:21 < bridge_> The only thing I can think of is gdb disabling aslr 15:22 < bridge_> If you still have the code maybe try enabling aslr under gdb, I'm curious 😄 15:22 < bridge_> Could it detect that it's being debugged and enable more strict assertions? 15:22 < bridge_> i'll order pizza and investigate it a bit. - it just bugs me that a broken function is getting called, half executed and i dont get a segfault 15:24 < bridge_> use asan/ubsan 15:26 < bridge_> He seems to have already found the bug 15:31 < bridge_> i know 15:32 < bridge_> Open your speed hud, this is speeding you up but eaten up by quantization, the old speeders clamped 1 to 5 15:34 < bridge_> so set max_speed on the new ones to 5 and they should behave **similar** 15:38 < bridge_> We thought about it but people decided against it, I was really in favor of adding different speeders, I might introduce a second variant for max_speed > 0, it's almost trivial to do 15:38 < bridge_> Ok I got. Thank you! 16:45 < bridge_> @ryozuki why is a function call a kind of a terminator? 16:49 < bridge_> functions can diverge 16:50 < bridge_> I'm a caveman, I'll make it an `Rvalue` 17:25 < bridge_> @ryozuki you have an error. https://edgl.dev/blog/sdl2-cmake/ 17:25 < bridge_> on the last line it should be $(nproc) not ${nproc} 17:27 < bridge_> @ryozuki you have an error. https://edgl.dev/blog/sdl2-cmake/ 17:27 < bridge_> on the last line it should be `$(nproc)` not `${nproc}` 18:27 < bridge_> curious thing, my gentoo has been picking a mirror in south africe recently, all the way from italy 18:28 < bridge_> it seems fast, so doesn't really matter, but still curious, why? 😄 18:35 < bridge_> Hello, handsome people!. How is it going? 18:35 < bridge_> I suddenly changed of internet connection and now the game detect me like i was playing with vpn 18:36 < bridge_> Any idea about why? 18:47 < bridge_> @ryozuki will your language have support for expression statements? 19:13 < bridge_> probs 19:13 < bridge_> mm rly old post xd 19:19 < bridge_> fix it!!! 20:20 < bridge_> this is a certified visual studio moment. you can force set CMAKE_RUNTIME_OUTPUT_DIRECTORY, CMAKE_LIBRARY_OUTPUT_DIRECTORY and CMAKE_ARCHIVE_OUTPUT_DIRECTORY to the same thing 20:20 < bridge_> these ppl don’t use visual studio my friend 20:54 < bridge_> Where issue? 20:54 < bridge_> (but PR is fire 🎉) 20:56 < bridge_> I switched to vscode with cmake tools extension, tried visual studio but it was very confusing 20:56 < bridge_> boooo 20:56 < bridge_> msys2 > 20:57 < bridge_> I also tried mingw within WSL but had 0 success 20:57 < bridge_> it is, but both were working for me out of the box, VS Ui is so full of things, too overloaded 20:57 < bridge_> which distro 20:57 < bridge_> arch cross compile is pretty ez 20:57 < bridge_> but all of that is useless when u have msys2 20:57 < bridge_> fr ong 20:57 < bridge_> Ubuntu yay 20:58 < bridge_> yea i cant imagine it'd be all that easy 20:58 < bridge_> CMake extension for VSC rules 20:59 < bridge_> it's alright 20:59 < bridge_> i dont think u should have to make the targets manually 20:59 < bridge_> qt creator makes them for you 20:59 < bridge_> exactly 21:00 < bridge_> VS found too many targets for me for comparison 21:00 < bridge_> each target for release/debug/release with debug symbols/idk what the 4th was/... 21:00 < bridge_> Please make skins for the rest of the chess pieces so someone can create a full chess game mode :bluekitty: 21:01 < bridge_> https://cdn.discordapp.com/attachments/293493549758939136/1361053575534481518/image.png?ex=67fd5b6b&is=67fc09eb&hm=68a6b2d8941be831ebf69cd3a70d706a26601753225bbc0dfef44213573aa5ea& 21:01 < bridge_> can we name the King just heinrich? :kek: 21:02 < bridge_> also why a black and white variant? We do have colors 21:03 < bridge_> Doesn't work because of the limited lighting with custom colors 21:03 < bridge_> Then it would be dark and light grey instead 21:27 < bridge_> they don have feet D: 21:33 < bridge_> i dont see feet here 21:33 < bridge_> https://cdn.discordapp.com/attachments/293493549758939136/1361061693525852381/phpZTvydV.png?ex=67fd62fb&is=67fc117b&hm=8072623ceec96f11f8c213a8682a44821bbba769097004dfc245f50ae0066177& 21:34 < bridge_> all tees should have feet x-x 21:35 < bridge_> ```cpp 21:35 < bridge_> ==257417==ERROR: AddressSanitizer: stack-overflow on address 0x7ffc1d0a6870 (pc 0x5986fd54a640 bp 0x7ffc1dd35870 sp 0x7ffc1d0a5f80 T0) 21:35 < bridge_> 2025-04-13 22:28:31 I http: task done: https://info.ddnet.org/info?name=bun%20bun 21:35 < bridge_> #0 0x5986fd54a640 in CBgDraw::OnRender() /home/solly/Code/ddnet/src/game/client/components/tclient/bg_draw.cpp:290 21:35 < bridge_> #1 0x5986fd77f624 in CGameClient::OnRender() /home/solly/Code/ddnet/src/game/client/gameclient.cpp:835:15 21:35 < bridge_> #2 0x5986fca43e7f in CClient::Render() /home/solly/Code/ddnet/src/engine/client/client.cpp:1076:17 21:35 < bridge_> #3 0x5986fca8665a in CClient::Run() /home/solly/Code/ddnet/src/engine/client/client.cpp:3377:5 21:35 < bridge_> #4 0x5986fcace1ba in main /home/solly/Code/ddnet/src/engine/client/client.cpp:5045:11 21:35 < bridge_> #5 0x7be9b7235487 in __libc_start_call_main /usr/src/debug/glibc/glibc/csu/../sysdeps/nptl/libc_start_call_main.h:58:16 21:35 < bridge_> #6 0x7be9b723554b in __libc_start_main /usr/src/debug/glibc/glibc/csu/../csu/libc-start.c:360:3 21:35 < bridge_> #7 0x5986fc196b14 in _start (/home/solly/mnt/icovps/Code/ddnet/build/builddebug/DDNet+0x143db14) (BuildId: 2c1dc242f93c455af15461c83b2aad5fce026484) 21:35 < bridge_> ``` 21:35 < bridge_> any1 know why this is happening x-x 21:35 < bridge_> 21:35 < bridge_> ```cpp 21:35 < bridge_> void CBgDraw::OnRender() 21:35 < bridge_> { 21:35 < bridge_> if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) 21:36 < bridge_> return; 21:36 < bridge_> ``` 21:36 < bridge_> line 290 is the `{` 21:36 < bridge_> i dont think im using... alot of stack space, and theres no recursion 21:37 < bridge_> it happens because of stack overflow 21:38 < bridge_> amazing analysis 21:40 < bridge_> is this code available on github? 21:41 < bridge_> it can be 21:41 < bridge_> i can try to help 21:41 < bridge_> thankz 21:42 < bridge_> https://github.com/SollyBunny/ddnet/tree/temp_bgdraw_stackoverflow 21:42 < bridge_> 21:50 < bridge_> removing the block of code in onrender works 21:50 < bridge_> i will continiously readd things till it breaks 21:50 < bridge_> forgot i could do that 21:59 < bridge_> @hokepoke here's how compile with msys2 instead of visual studio if u dont wanna do the workaround btw 21:59 < bridge_> ```sh 21:59 < bridge_> # deps 21:59 < bridge_> pacman -S git --noconfirm # long-term, better to set up git from Git for Windows repos (it's faster) 21:59 < bridge_> pacboy -S toolchain cmake curl ffmpeg freetype glew glslang libpng ninja opusfile python3 rust SDL2 spirv-tools sqlite vulkan-headers vulkan-loader wavpack x264 --noconfirm # rust is optional, install rustup & add to your PATH otherwise 21:59 < bridge_> 21:59 < bridge_> # ddnet 21:59 < bridge_> git clone https://github.com/ddnet/ddnet && cd ddnet 21:59 < bridge_> 21:59 < bridge_> cmake -B build -S . -DSECURITY_COMPILER_FLAGS=off # mingw quirk; 21:59 < bridge_> cmake --build build --config Release --parallel # optionally specify core count 21:59 < bridge_> 21:59 < bridge_> ./build/DDNet.exe 21:59 < bridge_> ``` 22:04 < bridge_> @hokepoke here's how compile with msys2 instead of visual studio if u dont wanna do the workaround btw 22:04 < bridge_> ```sh 22:04 < bridge_> # deps 22:04 < bridge_> pacman -S git --noconfirm # long-term, better to set up git from Git for Windows repos (it's faster) 22:04 < bridge_> pacboy -S toolchain cmake curl ffmpeg freetype glew glslang libpng ninja opusfile python3 rust SDL2 spirv-tools sqlite vulkan-headers vulkan-loader wavpack x264 --noconfirm # rust is optional, install rustup & add to your PATH otherwise 22:04 < bridge_> 22:04 < bridge_> # ddnet 22:04 < bridge_> git clone https://github.com/ddnet/ddnet && cd ddnet 22:04 < bridge_> 22:04 < bridge_> cmake -B build -S . -DSECURITY_COMPILER_FLAGS=off -G"Ninja Multi-Config" # mingw quirk; can use normal ninja generator but must add CMAKE_BUILD_TYPE & remove --config below instead 22:04 < bridge_> cmake --build build --config Release --parallel # optionally specify core count 22:04 < bridge_> 22:04 < bridge_> ./build/DDNet.exe 22:04 < bridge_> ``` 22:04 < bridge_> i edited it to add a non default thing i have & forgot about 22:04 < bridge_> ninja multi config is nice bcs you don't have to re-generate if you want to make a debug build & it's currently configured for release, it can do both. if u don't specify that it'll just fall back to normal ninja & then the makefiles you generate are tailored for that build type 22:10 < bridge_> https://github.com/SollyBunny/ddnet/blob/8a637708643ffc8c2458db39973fd2102a3930d0/src/game/client/components/tclient/bg_draw.cpp#L309-L310 22:10 < bridge_> you should use `GameClient()` instead of `CGameClient()` 22:11 < bridge_> i had isolated the issue to those lines, i couldnt for the life of me figure out what it was xd 22:11 < bridge_> thanks 22:11 < bridge_> what does CGameClient() do? 22:11 < bridge_> make a new one every frame xd 22:12 < bridge_> would be nice if asan showed you what things took up stack space 22:25 < bridge_> more arcane cpp errors i have no clue how they happen 22:25 < bridge_> ```cpp 22:25 < bridge_> float CurrentWidth() const 22:25 < bridge_> { 22:25 < bridge_> if(m_ForceWidth.has_value()) 22:25 < bridge_> return m_ForceWidth.value(); 22:25 < bridge_> return (float)g_Config.m_ClBgDrawWidth * m_This.m_Camera.m_Zoom; 22:25 < bridge_> } 22:25 < bridge_> ``` 22:25 < bridge_> somehow causes ub and segfault 22:25 < bridge_> https://cdn.discordapp.com/attachments/293493549758939136/1361074907299057744/message.txt?ex=67fd6f49&is=67fc1dc9&hm=19d720ede01eb229afca6d5e3a24ccee3261a400d7ad6844b9a2c93110454b61& 22:27 < bridge_> How do you create the object? Somehow `m_ForceWidth` is an uninitialized optional 22:27 < bridge_> emplace_back 22:27 < bridge_> it should be inited to std::nullopt 22:27 < bridge_> ```cpp 22:27 < bridge_> std::optional m_ForceWidth = std::nullopt; 22:27 < bridge_> std::optional m_ForceColor = std::nullopt; 22:27 < bridge_> ``` 22:28 < bridge_> What do you do with the object containing it? 22:28 < bridge_> its stored in a std::list inside the component 22:30 < bridge_> ` m_pvItems->emplace_back(*GameClient(), Dummy, Pos);` 22:30 < bridge_> creates the containing object 22:30 < bridge_> the constructor creates the item (which has m_ForceWidth) 22:30 < bridge_> ```cpp 22:30 < bridge_> CBgDrawItem(CGameClient &This, int Dummy, vec2 StartPos) 22:30 < bridge_> : CBgDrawItem(This, Dummy, CBgDrawItemDataPoint(StartPos, CurrentWidth(), CurrentColor())) 22:30 < bridge_> {} 22:30 < bridge_> CBgDrawItem(CGameClient &This, int Dummy, CBgDrawItemDataPoint StartPoint) : 22:30 < bridge_> m_This(This), m_Dummy(Dummy), m_QuadContainerIndex(m_This.Graphics()->CreateQuadContainer()), 22:30 < bridge_> m_LastPos(StartPoint.Pos()), m_BoundingBoxMin(StartPoint.Pos()), m_BoundingBoxMax(StartPoint.Pos()) 22:30 < bridge_> { 22:30 < bridge_> m_Data.push_back(StartPoint); 22:30 < bridge_> } 22:30 < bridge_> ``` 22:30 < bridge_> ah 22:30 < bridge_> i see 22:31 < bridge_> i did too much wizardry 22:31 < bridge_> and got punished for it 22:31 < bridge_> `CBgDrawItem(This, Dummy, CBgDrawItemDataPoint(StartPos, CurrentWidth(), CurrentColor()))` 22:31 < bridge_> currentWidth() is ub 22:33 < bridge_> Why is this a pointer to a list`std::list *m_pvItems;`? You probably want a `std::list> m_Items` instead. Also how does this even work with the size of `CBgDrawItem` being unknown in the header file? 22:33 < bridge_> its a pointer since the size is unknown 22:34 < bridge_> But the pointer is outside the list? 22:34 < bridge_> yes 22:34 < bridge_> its a pointer to a std::list 22:34 < bridge_> which is a known size 22:34 < bridge_> std::list> is invalid as unqieu_ptr requires the size 22:34 < bridge_> std::list> is invalid as unqieu_ptr requires a complete type 22:34 < bridge_> Hmmmm, but it would be a lot cleaner 22:35 < bridge_> to not have it as a ptr 22:35 < bridge_> would be nice, but it shouldnt cause mistakes 22:35 < bridge_> `std::list> m_Items` and put the class declaration in another file 22:35 < bridge_> if i include the class decleration then it can just be std::list 22:36 < bridge_> true 22:36 < bridge_> which i didnt do cuz it changes alot and i didnt want to recompile every time 22:36 < bridge_> and i *thought* that having it not be a dependency means faster compile times 22:38 < bridge_> I guess it would be faster for prototyping if you keep changing the file, because changing any gameclient component requires recompiling all others 22:38 < bridge_> yeah 22:41 < bridge_> i did dun the same thing in nameplates 22:41 < bridge_> tanks for the help 22:41 < bridge_> i shouldve gotten a rubber ducky 23:06 < bridge_> @robyt3 #10043 is ready for review again (pushed from Hotel room) 💪 :nouis: 23:06 < bridge_> https://github.com/ddnet/ddnet/pull/10043 23:07 < bridge_> guess I am mentally invested now in this 🙈 23:18 < bridge_> `const int LAYER_DEFAULT_TILESET = -1;` 23:18 < bridge_> should this be 23:18 < bridge_> a constexpr? 23:18 < bridge_> and static 23:27 < bridge_> This is outside of everything, compiler should be moving it out, could also be a Macro 23:27 < bridge_> which style does tw prefer? 23:28 < bridge_> macros are definatley bad 23:29 < bridge_> otherwise idk 23:29 < bridge_> ` Success &= CreateFolder("downloadedskins", TYPE_SAVE);` 23:29 < bridge_> downloadedskins seems to be created in init of cstorage, that means if u delete downloaded skins it breaks? 23:30 < bridge_> no it recreates it... 23:30 < bridge_> why is it created at the start then? 23:38 < bridge_> If I'd guess, it can fail to create the directory (like missing permissions etc.) 23:39 < bridge_> otherwise if it exists or if it created it it succeeded 23:39 < bridge_> to rephrase 23:39 < bridge_> if the folder is created when it is needed (if it was deleted after init), then why is it created at the start 23:44 < bridge_> ```cpp 23:44 < bridge_> const char *pMap = Client()->GetCurrentMap(); 23:44 < bridge_> SHA256_DIGEST Sha256 = Client()->GetCurrentMapSha256(); 23:44 < bridge_> char aSha256[SHA256_MAXSTRSIZE]; 23:44 < bridge_> sha256_str(Sha256, aSha256, sizeof(aSha256)); 23:44 < bridge_> ``` 23:44 < bridge_> why is the sha256 sha256'ed? 23:44 < bridge_> cghost:getpath 23:47 < furo> What do you mean? It's converting the hash to a string. 23:50 < bridge_> [facepalm~4](https://cdn.discordapp.com/emojis/885545277472276481.gif?size=48&animated=true&name=facepalm%7E4)