00:26 < bridge> Nice, do you have link? 01:13 < bridge> I forgot to give out useless words yesterday, so I'll give two now: 01:13 < bridge> `recondite` = `obscure` 01:13 < bridge> `diffident` = `shy` 02:44 < ws-client1> @zhn i actually changed my mind about that. Since I recently managed to get vanilla gameplay working without causing too much git conflict surface ddnet-insta can now do CTF and DM too 02:45 < ws-client1> did you find any bugs @pathos3005 ? 05:07 < bridge> Everyone just moved to the usual server instead -- will take some time to try some full games on the new experimental server 11:40 < bridge> Nice, when post/pre increment :owo: 11:40 < bridge> i don't need that 11:41 < bridge> And I almost made macros loading work :lol: 11:41 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1294958112150786048/image.png?ex=670ce739&is=670b95b9&hm=9acae15e741b6b0e1130b42f825ed5f557fe9c23ee760f9ba8e4866b1f782266& 11:41 < bridge> I have no idea how to debug that 11:43 < bridge> preincrement booh 11:45 < bridge> ```c 11:45 < bridge> typedef struct { 11:45 < bridge> const char *name; 11:45 < bridge> Data *(*fn)(Data *); 11:45 < bridge> } Macro; 11:45 < bridge> 11:45 < bridge> typedef struct { 11:45 < bridge> size_t size; 11:45 < bridge> Macro macros[]; 11:46 < bridge> } Macros; 11:46 < bridge> ``` 11:46 < bridge> how to make such structs in rust? 11:46 < bridge> to be precise how to do this part `Macro macros[];` 11:55 < bridge> Flexible Array Members don't exist in many languages. You'll have to just take the L and usea Vec 11:55 < bridge> Flexible Array Members don't exist in many languages. You'll have to just take the L and use a Vec 11:56 < bridge> C is such a brilliant language, makes me feel warm and fuzzy inside 12:59 < bridge> Look at dis :santatrollet: 12:59 < bridge> ```rust 12:59 < bridge> #[repr(C)] 12:59 < bridge> struct Macros { 12:59 < bridge> size: usize, 12:59 < bridge> _macros: [Macro; 0], 12:59 < bridge> } 12:59 < bridge> 12:59 < bridge> trait GimmeMacros<'a> { 12:59 < bridge> fn macros(self) -> &'a [Macro]; 12:59 < bridge> } 12:59 < bridge> 12:59 < bridge> impl<'a> GimmeMacros<'a> for *const Macros { 12:59 < bridge> fn macros(self) -> &'a [Macro] { 12:59 < bridge> unsafe { 12:59 < bridge> let skip_size = self.byte_add(size_of_val(&self.read().size)); 12:59 < bridge> std::slice::from_raw_parts(skip_size as *const Macro, self.read().size) 12:59 < bridge> } 12:59 < bridge> } 13:00 < bridge> } 13:00 < bridge> ``` 13:01 < bridge> @ryozuki scold him rn, disgusting unsafe used 13:02 < bridge> Look at dis :santatrollet: 13:02 < bridge> ```rust 13:02 < bridge> #[repr(C)] 13:02 < bridge> struct Macros { 13:02 < bridge> size: usize, 13:02 < bridge> _macros: [Macro; 0], 13:02 < bridge> } 13:02 < bridge> 13:02 < bridge> trait GimmeMacros { 13:02 < bridge> fn macros(&self) -> &[Macro]; 13:02 < bridge> } 13:02 < bridge> 13:02 < bridge> impl GimmeMacros for *const Macros { 13:02 < bridge> fn macros(&self) -> &[Macro] { 13:02 < bridge> unsafe { 13:02 < bridge> let skip_size = self.byte_add(size_of_val(&self.read().size)); 13:02 < bridge> std::slice::from_raw_parts(skip_size as *const Macro, self.read().size) 13:02 < bridge> } 13:02 < bridge> } 13:02 < bridge> } 13:02 < bridge> ``` 13:02 < bridge> whats this 13:03 < bridge> I have global variable of type `Macros` in shared object, and I had to get it somehow 13:04 < bridge> why u hace a global var 13:04 < bridge> h-1 for the departure of SpaceX Starship 13:04 < bridge> Emulating FAMs in Rust 13:30 < bridge> @robyt3 I don't think #9145 is sane. You have to be holding the mutex while modifying the condition 13:30 < bridge> https://github.com/ddnet/ddnet/pull/9145 13:39 < bridge> This answer looked good enough to me: https://stackoverflow.com/a/17102100 13:40 < bridge> всем привет 13:41 < bridge> можете подсказать,как скачать текстуры в ddnet 13:43 < bridge> You don't need to be holding the lock. But you do need to modify the condition itself under lock 13:43 < bridge> $english 13:43 < bridge> Hi! Most of us communicate in English. If you’re having trouble with English, use to help you out. 13:44 < bridge> You don't need to be holding the lock to notify. But you do need to modify the condition itself under lock 13:44 < bridge> E.g. the state needs to change under lock 13:44 < bridge> IOW the state needs to change under lock 13:46 < bridge> https://en.cppreference.com/w/cpp/thread/condition_variable first paragraph 13:48 < bridge> I see. I can fix it later 13:57 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1294992371867713616/yx5CBFJggJmedf9MvmCQd1S5wNYlCi2sRoxAAAAABJRU5ErkJggg.png?ex=670d0721&is=670bb5a1&hm=8c6654330087d018820fd32390aea7399d1e2149ffe9bfb1866637477b26a850& 14:29 < bridge> #off-topic or english in #questions 14:33 < bridge> LMAOOO 14:33 < bridge> spacex landed it 14:34 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1295001610870591560/image.png?ex=670d0fbb&is=670bbe3b&hm=8d678fe60c229e63a97f6a9502c03ba4f3aab2c15f22c78675af2de59713f323& 14:42 < bridge> Ez Clap 14:42 < bridge> Promising future is ahead, space era 14:45 < bridge> `android:supportsRtl="true"` biggest lie in ddnet code 😂 14:47 < bridge> Technically true since we don't have any Android-native layout code 14:48 < bridge> > Declares whether your application is willing to support right-to-left (RTL) layouts. 14:48 < bridge> Also this doesn't say anything about the actual effort that we take, just that we are willing 😄 14:48 < bridge> I don't understand why landscape is working properly in cpp version for the vk backend, but not in my app. 14:48 < bridge> 14:48 < bridge> What black magic do we use. 14:48 < bridge> 14:48 < bridge> I always get a surface suboptimal, bcs the orientation is 90° rotated (probably bcs teh default mode is not landscape) 14:49 < bridge> xD 14:49 < bridge> We pay google extra 14:50 < bridge> Maybe I should just debug cpp version if that claim is even true 14:50 < bridge> When latest NDK support @robyt3 xd 14:51 < bridge> How outdated are we? I think I had build problems with some newer versions :pepeW: 14:51 < bridge> Yeah, can i force the NDK toolkit to use? 14:52 < bridge> You mean if you have multiple installed? 14:53 < bridge> `mold: fatal: ddnet_engine_shared-cd5af9afb6c5385a.1x1mslembt45wzvj8781d2swp.rcgu.o: incompatible file type: arm64 is expected but got x86_64` 14:53 < bridge> 14:53 < bridge> This is the err in newer NDK versions, so weird 14:53 < bridge> I have yes 14:55 < bridge> And it works when you use mold with older NDK? Or does it maybe use a different linker with newer NDKs? 14:55 < bridge> as far as i remembered it worked in ndk 26 14:56 < bridge> it's compiling 14:56 < bridge> *elevator music* 14:56 < bridge> ok no 14:56 < bridge> it does not 😮 14:57 < bridge> ah wait 14:57 < bridge> that was about rust stable 14:57 < bridge> vs nightly, right 14:57 < bridge> `mold: error: undefined symbol: __sendto_chk` 14:57 < bridge> 14:57 < bridge> man ndk 26 used to work 14:57 < bridge> now it doesnt anymore :c 14:58 < bridge> ``` 14:58 < bridge> ANDROID_NDK_VERSION="$(cd "$ANDROID_HOME/ndk" && find . -maxdepth 1 | sort -n | tail -1)" 14:58 < bridge> ANDROID_NDK_VERSION="${ANDROID_NDK_VERSION:2}" 14:58 < bridge> # ANDROID_NDK_HOME must be exported for cargo-ndk 14:58 < bridge> export ANDROID_NDK_HOME="$ANDROID_HOME/ndk/$ANDROID_NDK_VERSION" 14:58 < bridge> ``` 14:58 < bridge> Seems like the build script currently uses the folder based on the sorting the filenames, so you can't easily use an older NDK 14:58 < bridge> ah yeah i remember that code 15:00 < bridge> well anyway, can't compile anyway, bcs this 15:00 < bridge> dunno if i need to recompile the libs again 15:00 < bridge> Did you make sure to clean the build directory after changing NDK? 15:01 < bridge> yeah it doesn't change it otherwise 😄 15:04 < bridge> ok recompiling android libs fixed it: 15:04 < bridge> 15:04 < bridge> next challenge 15:04 < bridge> ``` 15:04 < bridge> Path for java installation '/usr/lib/jvm/openjdk-17' (Common Linux Locations) does not contain a java executable 15:04 < bridge> Path for java installation '/usr/lib/jvm/openjdk-21' (Common Linux Locations) does not contain a java executable 15:04 < bridge> 15:04 < bridge> ``` 15:04 < bridge> xD 15:04 < bridge> it's just way too hard to compile for android 15:05 < bridge> openjdk-21-jdk ist schon die neueste Version (21.0.5~8ea-1). 15:05 < bridge> You should only have JDK 21 I guess. But the warnings can be ignored: https://stackoverflow.com/a/77799747 15:05 < bridge> ah it's only a warning i see 15:06 < bridge> confused me that they put it under the error 15:06 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1295009722164056156/image.png?ex=670d1749&is=670bc5c9&hm=20d484e3d2abb6ee858c4f3edf40e1cdec248ea3c414dc346692ffc295c58529& 15:06 < bridge> Yeah, I also get them though I only have JDK 21 15:06 < bridge> ok nice 15:06 < bridge> Did you pass a package name by argument? 15:06 < bridge> works now i think 15:06 < bridge> You passed `DDNet` when you should have passed `org.ddnet.client` I guess 15:07 < bridge> ``` 15:07 < bridge> Doppelte Klasse: org.ddnet.client.NativeMain 15:07 < bridge> public class NativeMain extends SDLActivity { 15:07 < bridge> 15:07 < bridge> ``` 15:07 < bridge> 15:07 < bridge> lmao 15:08 < bridge> it trolls now 15:08 < bridge> ok delete & recompile it is 15:08 < bridge> Did you delete the java files from the build folder? 15:08 < bridge> If you used a different package name before you'd still have the old files there 15:08 < bridge> ah interesting 15:08 < bridge> epyc worked 15:11 < bridge> Ok the vk backend actually gets the same orientation here too. 15:11 < bridge> 15:11 < bridge> Really weird that it works here 15:11 < bridge> are touch controls a release mode thing? 15:11 < bridge> for me there were not on by default 15:12 < bridge> They should be enabled by default if you compiling for Android 15:12 < bridge> They should be enabled by default if you are compiling for Android 15:12 < bridge> Mh weird 15:12 < bridge> it deleted the old app, so this isnt some old config 15:12 < bridge> i also got the welcome screen 15:13 < bridge> i reinstall 15:13 < bridge> Weird. Do you have other Android specific functions? E.g. when you minimize the app it should save the config 15:13 < bridge> still not there lol 15:13 < bridge> but i had a clean config 15:13 < bridge> so it must be on or not? 15:14 < bridge> Can you check in the console? 15:14 < bridge> If the config failed to load you'd also see no touch controls, but you should see the extra line of buttons in the ingame menu (and a warning) 15:15 < bridge> yeah but there are not there either 15:16 < bridge> To confirm, did you actually check our the PR? It's not merged yet 15:16 < bridge> To confirm, did you actually check out the PR? It's not merged yet 15:16 < bridge> oh lol true xD 15:16 < bridge> i probably switched the branches in the meantime 15:19 < bridge> Ok ok I found all variables in my puzzle 15:19 < bridge> We actually ignore `VK_SUBOPTIMAL_KHR` in `vkQueuePresentKHR` and only handle it in `vkAcquireNextImageKHR` 15:19 < bridge> Funny that android reports that in one function but not the other 15:21 < bridge> Well only wasted 6 hours of my life to obtain this information 15:21 < bridge> so all fine 16:11 < bridge> epyc mobile moment 16:11 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1295026031471886336/Screencast_20241013_160910.webm?ex=670d267a&is=670bd4fa&hm=7bac13e233e743903accdbf5dd09acb3169f40d1e95bc552977d134f8ee7ecf0& 16:11 < bridge> the fps are really good 16:11 < bridge> should try ctf1 on cpp version 16:15 < bridge> comparable. 16:15 < bridge> 16:15 < bridge> wtf is this green border tho? 16:15 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1295027011151986708/image.png?ex=670d2763&is=670bd5e3&hm=6c9002b4036f8a93892606a63a5acc4a8fd5920164ad05f756ee12518556a9d3& 16:16 < bridge> Maybe it's shown that screen recorder is active? 16:16 < bridge> Also there's a black border one the left side outside of the green one 16:16 < bridge> I dunno, possible 16:16 < bridge> that is bcs of my camera 16:16 < bridge> i use scrcpy 16:17 < bridge> Maybe it is, bcs ddnet is tagged as game in the manifest 16:17 < bridge> and this is some weird gamer overlay lmao 17:29 < bridge> is it just me or is /top5team broken 17:29 < bridge> /top5 works fine 17:40 < bridge> ye its brfoken 17:41 < bridge> Given how slow even `top5` is I'm guessing we've finally gone past the point where `top5team` queries can end in a reasonable amount of time 17:43 < bridge> Oh nvm, it's actually a broken query 17:43 < bridge> I wonder how that happened 17:45 < bridge> @kebscs https://github.com/ddnet/ddnet/commit/279b14cc44f4a60914d016fb904c797cb83a4d51 I have a feeling this is it 17:46 < bridge> Yes, that is it, you made the `LIMIT` a `?` but didn't add an argument to bind to it 17:48 < bridge> and it was broken in every iteration, of force push you made, I don't get how this even worked in your local testing 17:49 < bridge> actually nvm, it does look bound, hm maybe something chiller did 17:55 < bridge> "no idea but it's prolly chiler's fault" is a vibe :xd: 18:05 < bridge> ```sql 18:06 < bridge> SELECT name, time, ranking, teamsize 18:06 < bridge> FROM ( 18:06 < bridge> SELECT teamsize, ranking, id, server 18:06 < bridge> FROM ( 18:06 < bridge> SELECT Rank() over w AS ranking, count(*) AS teamsize, id, server 18:06 < bridge> FROM ( 18:06 < bridge> SELECT * 18:06 < bridge> FROM record_teamrace AS tr 18:06 < bridge> INNER JOIN record_race AS rr 18:06 < bridge> ON tr.map = rr.map 18:06 < bridge> AND tr.name = rr.name 18:06 < bridge> AND tr.time = rr.time 18:06 < bridge> AND tr.timestamp = rr.timestamp ) 18:06 < bridge> WHERE map = 'Multeasymap' 18:06 < bridge> GROUP BY id window w AS (ORDER BY min(time)) ) AS l1 18:06 < bridge> WHERE server LIKE '%' 18:06 < bridge> ORDER BY ranking ASC 18:06 < bridge> LIMIT 0, 5) AS l2 18:06 < bridge> 18:06 < bridge> INNER JOIN record_teamrace AS r 18:06 < bridge> ON l2.id = r.id 18:06 < bridge> ORDER BY ranking ASC, r.id, name ASC 18:06 < bridge> ``` 18:06 < bridge> ```sql 18:06 < bridge> SELECT name, time, ranking, teamsize 18:06 < bridge> FROM ( 18:06 < bridge> SELECT teamsize, ranking, id, server 18:06 < bridge> FROM ( 18:06 < bridge> SELECT Rank() over w AS ranking, count(*) AS teamsize, id, server 18:06 < bridge> FROM ( 18:06 < bridge> SELECT * 18:06 < bridge> FROM record_teamrace AS tr 18:06 < bridge> INNER JOIN record_race AS rr 18:07 < bridge> ON tr.map = rr.map 18:07 < bridge> AND tr.name = rr.name 18:07 < bridge> AND tr.time = rr.time 18:07 < bridge> AND tr.timestamp = rr.timestamp ) 18:07 < bridge> WHERE map = 'Multeasymap' 18:07 < bridge> GROUP BY id window w AS (ORDER BY min(time)) ) AS l1 18:07 < bridge> WHERE server LIKE '%' 18:07 < bridge> ORDER BY ranking ASC 18:07 < bridge> LIMIT 0, 5) AS l2 18:07 < bridge> It 100% worked when i tested it 18:07 < bridge> This is what the query looks like, I extracted it with gdb and filled in the ? by hand, it doesn't run 18:07 < bridge> Dont think it broke when resolving merge condlict 18:07 < bridge> And it passed unit test 18:08 < bridge> Mb the db server is simply outdated and doesnt understand some syntax 18:10 < bridge> ```sql 18:10 < bridge> SELECT Rank() over w AS ranking, count(*) AS teamsize, id, server 18:10 < bridge> FROM ( 18:10 < bridge> SELECT * 18:10 < bridge> FROM record_teamrace AS tr 18:10 < bridge> INNER JOIN record_race AS rr 18:10 < bridge> ON tr.map = rr.map 18:10 < bridge> AND tr.name = rr.name 18:10 < bridge> AND tr.time = rr.time 18:10 < bridge> AND tr.timestamp = rr.timestamp 18:11 < bridge> ) 18:11 < bridge> WHERE map = 'Multeasymap' 18:11 < bridge> GROUP BY id window w AS (ORDER BY min(time)) 18:11 < bridge> ``` 18:11 < bridge> This subquery is already wrong somehow 18:11 < bridge> well map already sound ambiguous 18:11 < bridge> tbh i dont how it should work at all 18:11 < bridge> lmao 18:11 < bridge> I already tried `tr.map` just in case 18:12 < bridge> but select * 18:12 < bridge> is that allowed for inner joins? 18:13 < bridge> it must be fine because @kebscs says it runs fine locally 18:14 < bridge> Well I can only say that the FROM () IMO needs a name 18:14 < bridge> 18:14 < bridge> like `as b` 18:14 < bridge> 18:14 < bridge> and then b.map = '...' 18:14 < bridge> That is what i'd intuitively do 18:14 < bridge> But tbh the SQL syntax always allows 30000 variants to work as well 18:14 < bridge> So I can't say what the real err is xD 18:16 < bridge> yes, giving everything names fixed it 18:16 < bridge> ```sql 18:16 < bridge> SELECT Rank() over w AS ranking, count(*) AS teamsize, id, server 18:16 < bridge> FROM ( 18:16 < bridge> SELECT tr.map as map, tr.time as time, tr.id as id, rr.server as server 18:16 < bridge> FROM record_teamrace AS tr 18:16 < bridge> INNER JOIN record_race AS rr 18:16 < bridge> ON tr.map = rr.map 18:16 < bridge> AND tr.name = rr.name 18:16 < bridge> AND tr.time = rr.time 18:16 < bridge> AND tr.timestamp = rr.timestamp 18:16 < bridge> ) AS kek 18:17 < bridge> WHERE kek.map = 'Multeasymap' 18:17 < bridge> GROUP BY id window w AS (ORDER BY min(time)) 18:17 < bridge> ``` 18:18 < bridge> This query looks insanely expensive btw 18:19 < bridge> no other way to do it when teamrace doesnt hold server 18:19 < bridge> i took this query from website source 18:20 < bridge> Yeah, probably no other way to do it except adding server to teamrace, anyway, the db is a mess. The thing is this doesn't work and needs to be fixed 18:21 < bridge> With names it works, including the more limited select on line 3. So I guess you can just commit that 18:21 < bridge> im guessing differnece between mysql and sqlite 18:21 < bridge> AS kek 18:21 < bridge> Is also easier to follow, even if more verbose 😄 18:22 < bridge> i tested sqlite only locally 18:22 < bridge> ``` 18:22 < bridge> MariaDB [teeworlds]> SELECT VERSION(); 18:22 < bridge> +-------------------------------+ 18:22 < bridge> | VERSION() | 18:22 < bridge> +-------------------------------+ 18:22 < bridge> | 10.11.6-MariaDB-0+deb12u1-log | 18:22 < bridge> +-------------------------------+ 18:22 < bridge> 1 row in set (0.000 sec) 18:22 < bridge> ``` 18:22 < bridge> or if you want to mess around with debugging it 18:22 < bridge> Probably, sqlite is extremely loose 18:23 < bridge> generally don't use select * in production code ._. 18:25 < bridge> didnt know theres a diff when there isnt many columns 18:25 < bridge> i dont work with dbs that much 18:26 < bridge> is fine, happens, not the end of the world. 18:26 < bridge> good to know tho 18:26 < bridge> insert or update is scarier 😬 18:26 < bridge> it's not an extremely important command either, so doesn't even need an emergency restart 18:26 < bridge> no backups 18:26 < bridge> no mercy 18:27 < bridge> delete and update are the scariest, insert is still not the end of the world 😄 18:27 < bridge> true xd 18:27 < bridge> during a lifetime everyone had that one delete from without where 18:27 < bridge> is that still a thing 18:27 < bridge> yep 18:27 < bridge> or is that not allowed anymore 18:27 < bridge> ok 18:28 < bridge> actually insane xD 20:20 < bridge> what's the endpoint to get player's info? 20:47 < bridge> Can we allow nameplates to go smaller? The lowest size looks like it should be the default :justatest: 20:47 < bridge> Really weird how massive they are 20:47 < bridge> why not 20:48 < bridge> if u want it so bad u can just fork it 20:48 < bridge> I mean for the ddnet client, not just editing my own client 20:48 < bridge> alr 20:51 < bridge> ig this is all the code that is used for the nameplate size 20:51 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1295096591866400778/image.png?ex=670d6831&is=670c16b1&hm=e94f291dd71c4558883e3c64dbd8c6d7ac976bdec93beabd2de91d26413ee509& 20:52 < bridge> so if its 0 font size is 18 21:37 < bridge> @learath2 I kinda did little steps towards macros and here's so far what I've done. It's a macro written in C for my language called by Rust xD 21:37 < bridge> ```rust 21:37 < bridge> fn printf(format: *i8, _: *i8) -> void; 21:37 < bridge> 21:37 < bridge> fn main() -> u8 { 21:37 < bridge> let lol: *i8 = gimme_points!(); 21:37 < bridge> 21:37 < bridge> printf("Player's points: %s", lol); 21:37 < bridge> 21:37 < bridge> return 0; 21:37 < bridge> } 21:37 < bridge> ``` 21:37 < bridge> 21:37 < bridge> Shared object file 21:37 < bridge> ```c 21:37 < bridge> Data Points(Data data, size_t _) { 21:37 < bridge> char buf[256]; 21:37 < bridge> 21:37 < bridge> FILE *file = fopen("~/personal/c_playground/file", "r"); 21:37 < bridge> fread(buf, sizeof(buf), 1, file); 21:37 < bridge> int n = strlen((const char *)buf); 21:37 < bridge> 21:37 < bridge> char *str = (char *)malloc(n); 21:37 < bridge> memcpy(str, buf, n); 21:37 < bridge> // Overwrite '\n' 21:37 < bridge> str[n - 1] = '\0'; 21:37 < bridge> 21:37 < bridge> return str; 21:38 < bridge> } 21:38 < bridge> 21:38 < bridge> Macros macros = { 21:38 < bridge> i wanted to fetch player's points but cloudflare redirects to https :pepeW: 21:39 < bridge> i wanted to fetch player's points from api but cloudflare redirects to https :pepeW: 21:39 < bridge> Macros in different language is interesting 😄 21:40 < bridge> i think i can compile it in my language actually xd 21:40 < bridge> but i started prototyping in C so here we go 21:42 < bridge> ```c 21:42 < bridge> int n = fread(buf, sizeof buf, 1, file); 21:42 < bridge> buf[n - 1] = '\0'; 21:42 < bridge> 21:42 < bridge> char *str = malloc(n * sizeof *str); 21:42 < bridge> memcpy(str, buf, n); 21:42 < bridge> 21:42 < bridge> return str; 21:42 < bridge> ``` 21:42 < bridge> Don't cast malloc, don't strlen for no reason 21:43 < bridge> I'm sorry :feelsbadman: 21:44 < bridge> memcpy(str, buf, n); 21:44 < bridge> // Overwrite '\n' 21:44 < bridge> str[n - 1] = '\0'; 21:44 < bridge> 21:44 < bridge> that's one way to handle null termination 21:44 < bridge> ``` 21:45 < bridge> memcpy(str, buf, n); 21:45 < bridge> // Overwrite '\n' 21:45 < bridge> str[n - 1] = '\0'; 21:45 < bridge> ``` 21:45 < bridge> that's one way to handle null termination 23:00 < bridge> big agree 23:16 < bridge> who made the catch mod (not zcatch) ? 23:18 < bridge> $wiki catch 23:18 < bridge> Mh no wiki :c 23:19 < bridge> malwarebytes flagged 3 files in a zip i had of the mod 23:20 < bridge> xD 23:20 < bridge> Is it this? 23:20 < bridge> https://www.teeworlds.com/forum/viewtopic.php?id=4810 23:20 < bridge> one of them is making a connection to 77.224.14.* which is located in spain 23:21 < bridge> looks like yes 23:21 < bridge> you "catch" tees and the goal is to catch all tees 23:21 < bridge> it's like zcatch but solo 23:21 < bridge> i think there was a team mode as well 23:22 < bridge> "I dont copy anything from other mods exspecialy not catching16, only help from Redix." 23:22 < bridge> 23:22 < bridge> mh 23:22 < bridge> I still have a catch16 src code somewhere 23:25 < bridge> more like this one actually 23:25 < bridge> https://github.com/AssassinTee/catch64 23:25 < bridge> ah neat 😄