10:39 <+bridge> [ddnet] I'm interested to work on https://github.com/ddnet/ddnet/issues/486, do you have any ideas/suggestions how it might work? 10:40 <+bridge> [ddnet] I was thinking of allowing the user to select multiple layers at once (with shift-clicking maybe), then making the right-click selection include multiple layers 10:41 <+bridge> [ddnet] But, this won't work well with the tiles overview which shows on Space 10:42 <+bridge> [ddnet] that idea sounds good 10:42 <+bridge> [ddnet] maybe you could just disable space if you selected multiple layers 10:48 <+bridge> [ddnet] yeah, that's always an option 10:48 <+bridge> [ddnet] BTW, is there some sort of pallette of recent tile selections? 10:49 <+bridge> [ddnet] no, I think that doesn't exist 10:50 <+bridge> [ddnet] multiple layer selection also has some other problems 10:50 <+bridge> [ddnet] e.g. layers can have an offset that is not a multiple of tiles (the unit for the offsets is 1/32 tile width) 10:55 <+bridge> [ddnet] can layers have a tilesize different from the default (e.g. zooming) 10:55 <+bridge> [ddnet] ? 10:55 <+bridge> [ddnet] can layers have a tilesize different from the default (e.g. scaling) 10:55 <+bridge> [ddnet] uh, scaling, not zooming 10:55 <+bridge> [ddnet] what do you mean 10:56 <+bridge> [ddnet] well, can a tiles layer be scaled 2x smaller? 10:56 <+bridge> [ddnet] or can it just be offset 10:57 <+bridge> [ddnet] I think, multi-layer editing in different groups is just asking for trouble anyway.. 10:57 <+bridge> [ddnet] i still dont get it xD 10:58 <+bridge> [ddnet] read the whole conversation (and the issue) 10:58 <+bridge> [ddnet] ye 10:58 <+bridge> [ddnet] but i dont get what you are trying to ask 10:59 <+bridge> [ddnet] ah no 10:59 <+bridge> [ddnet] the tilesize is always the same 11:01 <+bridge> [ddnet] yeah, but layers with some parallax are going to break expectations when doing multi-layer editing, so I guess they should be left out for now 11:16 <+bridge> [ddnet] @heinrich5991 the skinlist is in menu_settings.cpp, right? 11:25 <+bridge> [ddnet] how do i call a function from skins.cpp in menu_settings.cpp? 11:27 <+bridge> [ddnet] @heinrich5991 11:38 <+bridge> [ddnet] @heinrich5991 i cant check wether the skin is a vanilla skin or not from menu_settings.cpp? 11:38 <+bridge> [ddnet] i try to use IsVanillaSkin from skins.cpp 11:46 <@deen> Learath2: are you working on the recvmmsg thingy? 11:46 <+bridge> [ddnet] @Bojidar Marinov can you help me? 11:57 <+bridge> [ddnet] @Bojidar Marinov I guess only layers with the same parallax should be selectable for multi-editing 11:58 <+bridge> [ddnet] and maybe layers with the same offset, for implementation sanity ๐Ÿ™‚ 12:00 <+bridge> [ddnet] @fokkonaut add a new field `m_IsVanillaSkin` in `CSkin` in src/game/client/component/skins.h 12:00 <+bridge> [ddnet] ok 12:00 <+bridge> [ddnet] done 12:00 <+bridge> [ddnet] and set it in the appropriate places 12:00 <+bridge> [ddnet] (check where the other fields in that struct get set in the src/game/client/components/skins.cpp 12:00 <+bridge> [ddnet] in the struct CSkin? 12:01 <+bridge> [ddnet] ) 12:01 <+bridge> [ddnet] what is a field 12:01 <+bridge> [ddnet] the variables in the struct 12:02 <+bridge> [ddnet] ah 12:02 <+bridge> [ddnet] yeah, same parallax and offset sounds good 12:02 <+bridge> [ddnet] @heinrich5991 do i need to give parameters? 12:02 <+bridge> [ddnet] check where `m_OrgTexture` texture is set 12:02 <+bridge> [ddnet] then do something similar for `m_IsVanillaSkin` 12:03 <+bridge> [ddnet] or maybe name that variable `m_IsVanilla`, it's already in the `CSkin` struct 12:04 <+bridge> [ddnet] :sendhelp: 12:06 <+bridge> [ddnet] in your text editor, search for `m_OrgTexture` in src/game/client/components/skins.cpp 12:06 <+bridge> [ddnet] what do you find? 12:07 <+bridge> [ddnet] the oninit 12:07 <+bridge> [ddnet] okay 12:07 <+bridge> [ddnet] so apparently, a `CSkin` is initialized here 12:07 <+bridge> [ddnet] so you also have to set `m_IsVanilla` 12:08 <+bridge> [ddnet] so `m_DummySkin.m_IsVanilla = โ€ฆ` 12:08 <+bridge> [ddnet] why dummy? 12:08 <+bridge> [ddnet] actually without the ```m_``` 12:09 <+bridge> [ddnet] what do you see in the `OnInit` function? 12:09 <+bridge> [ddnet] a reset? 12:10 <+bridge> [ddnet] or what u mean 12:10 <+bridge> [ddnet] I mean you see a usage of `CSkin` there 12:10 <+bridge> [ddnet] yes 12:11 <+bridge> [ddnet] what does the code involving `CSkin` do there? 12:11 <+bridge> [ddnet] reset it because it failed to load 12:11 <+bridge> [ddnet] yes, something failed to load 12:11 <+bridge> [ddnet] but what it does is *add* a new skin to the skin list 12:11 <+bridge> [ddnet] `m_aSkins.add(DummySkin);` 12:12 <+bridge> [ddnet] so if the client failed to load all skins (it has an empty skin list) 12:12 <+bridge> [ddnet] the function adds at least one skin 12:12 <+bridge> [ddnet] and that skin is initialized there 12:12 <+bridge> [ddnet] aaahh 12:12 <+bridge> [ddnet] ok 12:13 <+bridge> [ddnet] and now? 12:13 <+bridge> [ddnet] now you have to think about what value you need to assign to `DummySkin.m_IsVanilla` 12:14 <+bridge> [ddnet] the result of the static bool IsVanillaSkin? 12:14 <+bridge> [ddnet] well, what parameter would you give to that function? what is the dummy skin's name? 12:15 <+bridge> [ddnet] ??11 12:15 <+bridge> [ddnet] ??^^ 12:15 <+bridge> [ddnet] what is the name of the skin that is added in that function? 12:15 <+bridge> [ddnet] ahj 12:15 <+bridge> [ddnet] its dummy 12:15 <+bridge> [ddnet] so its non vanilla, so -1? 12:16 <+bridge> [ddnet] a `bool` can only be `true` or `false` 12:16 <+quinerr> Hi, as ddnet package available in Debian, could it be mentioned in https://ddnet.tw/downloads/ ? I think many people are just not aware of this. 12:16 <+bridge> [ddnet] so false xd 12:16 <+bridge> [ddnet] this seems to be a fallback skin (it gets added when no other skins are available) 12:17 <+bridge> [ddnet] so it might be beneficial to set `m_IsVanilla` to `true` 12:17 <+bridge> [ddnet] true 12:17 <+bridge> [ddnet] okay, do that 12:17 <+bridge> [ddnet] did 12:17 <+bridge> [ddnet] then move on to the next occurence 12:17 <+bridge> [ddnet] of `m_OrgTexture` 12:18 <+bridge> [ddnet] its getting set in skins.cpp 12:18 <+bridge> [ddnet] in SkinScan() 12:18 <+bridge> [ddnet] ``` if(g_Config.m_ClVanillaSkinsOnly && !IsVanillaSkin(aFilenameWithoutPng)) 12:18 <+bridge> [ddnet] { 12:18 <+bridge> [ddnet] return 0; 12:18 <+bridge> [ddnet] }``` 12:19 <+bridge> [ddnet] found that there ๐Ÿ˜ฎ 12:19 <+bridge> [ddnet] that's not a `m_OrgTexture` occurence 12:19 <+bridge> [ddnet] wait 12:19 <+bridge> [ddnet] ``` Skin.m_OrgTexture = pSelf->Graphics()->LoadTextureRaw(Info.m_Width, Info.m_Height, Info.m_Format, Info.m_pData, Info.m_Format, 0); 12:19 <+bridge> [ddnet] ``` 12:19 <+bridge> [ddnet] you're not in the newest version, if that is in `SkinScan()` 12:20 <+bridge> [ddnet] sec 12:20 <@heinrich5991> quinerr: hi 12:20 <+quinerr> hi, hi... 12:21 <@heinrich5991> can you link the package website? 12:21 <+bridge> [ddnet] i am 12:22 <+bridge> [ddnet] wait 12:22 <@heinrich5991> https://packages.debian.org/buster/ddnet 12:22 <@heinrich5991> ah 12:22 <+bridge> [ddnet] i will clone again 12:23 <+bridge> [ddnet] you aren't, I changed it ๐Ÿ˜ƒ 12:23 <+bridge> [ddnet] ^^ 12:24 <+quinerr> https://packages.debian.org/search?keywords=ddnet 12:24 <+quinerr> this is better 12:24 <+quinerr> (also available in Ubuntu, of course 12:24 <@heinrich5991> uh, nice :) 12:26 <+bridge> [ddnet] aaah 12:26 <+bridge> [ddnet] now 12:26 <+bridge> [ddnet] ```char aFilenameWithoutPng[128]; 12:26 <+bridge> [ddnet] str_copy(aFilenameWithoutPng, pName, sizeof(aFilenameWithoutPng)); 12:26 <+bridge> [ddnet] aFilenameWithoutPng[str_length(aFilenameWithoutPng) - 4] = 0;``` 12:26 <+bridge> [ddnet] this is how it looks like now 12:27 <+bridge> [ddnet] i have the new version now 12:30 <+bridge> [ddnet] and now 12:30 <+bridge> [ddnet] ``` Skin.m_OrgTexture = pSelf->Graphics()->LoadTextureRaw(Info.m_Width, Info.m_Height, Info.m_Format, Info.m_pData, Info.m_Format, 0); 12:30 <+bridge> [ddnet] ``` 12:30 <+bridge> [ddnet] this is next 12:32 <+bridge> [ddnet] @heinrich5991 what now 12:32 <+bridge> [ddnet] now do the same steps as before 12:32 <+bridge> [ddnet] understand what the function is doing 12:33 <+bridge> [ddnet] and figure out what to value to assign to `m_IsVanilla` 12:34 <@heinrich5991> quinerr: I made an issue for now: https://github.com/ddnet/ddnet-web/issues/50 12:34 <@heinrich5991> feel free to make a PR, otherwise I'll do it somewhen 12:34 <@heinrich5991> thanks for your packaging work :) 12:40 <+bridge> [ddnet] so @heinrich5991 this is loading the skins? 12:40 <+bridge> [ddnet] yes 12:40 <+bridge> [ddnet] so here i need to set it 12:40 <+bridge> [ddnet] to false if the skin is not vanilla 12:40 <+bridge> [ddnet] yes 12:41 <+bridge> [ddnet] so basically i can use the same if from the old code? 12:42 <+bridge> [ddnet] I don't think you need an `if` 12:42 <+quinerr> Thanks you too 12:42 <+bridge> [ddnet] how else 12:43 <+bridge> [ddnet] lol 12:43 <+bridge> [ddnet] show me your code with an `if` 12:43 <+bridge> [ddnet] if (g_Config.m_ClVanillaSkinsOnly && !IsVanillaSkin(aFilenameWithoutPng)) 12:44 <+bridge> [ddnet] as i said like the old one 12:44 <+bridge> [ddnet] if you then continue with 12:44 <+bridge> [ddnet] ``` 12:44 <+bridge> [ddnet] Skin.m_IsVanilla = true; 12:44 <+bridge> [ddnet] else 12:44 <+bridge> [ddnet] Skin.m_IsVanilla = false; 12:44 <+bridge> [ddnet] ``` 12:44 <+bridge> [ddnet] then you can just write 12:45 <+bridge> [ddnet] ye 12:45 <+bridge> [ddnet] `Skin.m_IsVanilla = g_Config.m_ClVanillaSkinsOnly && !IsVanillaSkin(aFilenameWithoutPng)` 12:45 <+bridge> [ddnet] lol? 12:45 <+bridge> [ddnet] that works? 12:45 <+bridge> [ddnet] yes, why not? 12:45 <+bridge> [ddnet] never seen such a line 12:45 <+bridge> [ddnet] okay 12:46 <+bridge> [ddnet] what you likely want to do instead is `Skin.m_IsVanilla = IsVanillaSkin(aFilenameWithoutPng)` 12:46 <+bridge> [ddnet] and then decide at the site where you want to display the skins, depending on `g_Config.m_ClVanillaSkinsOnly` 12:46 <+bridge> [ddnet] okay, will do that 12:47 <+bridge> [ddnet] ```CSkin Skin;``` 12:47 <+bridge> [ddnet] this was above the orgtexture stuff 12:47 <+bridge> [ddnet] can i just move it to the top? 12:48 <+bridge> [ddnet] yes, you could, but I think it would be better to instead move your `m_IsVanilla` thing 12:48 <+bridge> [ddnet] okayx 12:52 <+bridge> [ddnet] fuck it i mixed some stuff, need to clone it again 12:53 <+bridge> [ddnet] at one point, you should try to learn git a bit ๐Ÿ˜‰ 12:53 <+bridge> [ddnet] it would help in such a situation 12:53 <+bridge> [ddnet] fuck no everything is alright 12:53 <+bridge> [ddnet] im just dumb xD 12:58 <+bridge> [ddnet] @Bojidar Marinov did you test your stuff? 12:59 <+bridge> [ddnet] it kind of works 13:00 <+bridge> [ddnet] how do i refresh the skin list 13:01 <+bridge> [ddnet] @heinrich5991 13:01 <+bridge> [ddnet] you probably don't need to refresh it 13:01 <+bridge> [ddnet] ``` if(g_Config.m_ClVanillaSkinsOnly && !s->m_IsVanilla) 13:01 <+bridge> [ddnet] continue;``` 13:01 <+bridge> [ddnet] 13:01 <+bridge> [ddnet] ive added this 13:01 <+bridge> [ddnet] I'd guess that it's rendered every tick 13:01 <+bridge> [ddnet] where did you add that? 13:02 <+bridge> [ddnet] s_initskinlist 13:02 <+bridge> [ddnet] there is a for schleife 13:02 <+bridge> [ddnet] ah wait 13:03 <+bridge> [ddnet] it only gets triggered if s_InitSkinList is true 13:03 <+bridge> [ddnet] so i would need to set it true every time i change the vanilla setting right? 13:04 <+bridge> [ddnet] no 13:04 <+bridge> [ddnet] search etc. also works without "refreshing" the skin list 13:04 <+bridge> [ddnet] everything is rendered onto the screen every tick 13:04 <+bridge> [ddnet] you need to find where it is rendered and skip the rendering 13:05 <+bridge> [ddnet] oki 13:05 <+bridge> [ddnet] (it's in the same function) 13:06 <+bridge> [ddnet] it does work with refrsh 13:06 <+bridge> [ddnet] ```s_InitSkinList = true;``` 13:06 <+bridge> [ddnet] yes. but it also reloads the skins, which isn't necessary 13:06 <+bridge> [ddnet] oh 13:06 <+bridge> [ddnet] mh 13:07 <+bridge> [ddnet] then I guess also do it that way 13:07 <@heinrich5991> jimby: how exactly does this relate to ddnet and isn't just spam? 13:09 <+bridge> [ddnet] working fine ^^ 13:09 <+bridge> [ddnet] except one thing 13:10 <+bridge> [ddnet] lemme check 13:21 <+bridge> [ddnet] @heinrich5991 13:21 <+bridge> [ddnet] i need some more help 13:21 <+bridge> [ddnet] can't help you if you don't formulate a question 13:21 <+bridge> [ddnet] 2 little bugs: 13:22 <+bridge> [ddnet] first: if you have vanilla skins on and have picked a skin that is not from the vanilla skins it will show you the first skin from the list (in my case Ablush Neon or something like that) in the field "Your skin" in settings 13:23 <+bridge> [ddnet] 13:23 <+bridge> [ddnet] https://cdn.discordapp.com/attachments/293493549758939136/471638582914973697/Base_Profile_Screenshot_2018.07.25_-_13.23.09.16.png 13:23 <+bridge> [ddnet] but ingame its a default one 13:24 <+bridge> [ddnet] second: if vanilla skins is on and also skin prefix it doesnt show the prefix because the prefix skins cant load, we need to make that possible. 13:28 <+bridge> [ddnet] dunno about the first one 13:28 <+bridge> [ddnet] not sure about the second one either tbh 13:28 <+bridge> [ddnet] ๐Ÿ˜ฎ 13:28 <+bridge> [ddnet] mhhh 13:29 <+bridge> [ddnet] and now? 13:29 <+bridge> [ddnet] ok so i commit like this and you try a bit @heinrich5991 ? 13:30 <+bridge> [ddnet] or what 13:30 <+bridge> [ddnet] you can commit it and make a PR, noting that it's not yet finished 13:30 <+bridge> [ddnet] mentioning the problems 13:30 <+bridge> [ddnet] I don't have time right now to continue helping, maybe later ๐Ÿ™‚ 13:31 <+bridge> [ddnet] oki 13:32 <@deen> I thought only DDNet Discord hat trolls running around, now after seeing this freenodegate stuff ours look kinda harmless 13:44 <@heinrich5991> deen: bors permissions are now automatically synced with push permissions on github 13:44 <@heinrich5991> but I think bors is only useful for repositories with CI (compilation and/or test) 13:44 <@deen> oops 13:52 <+bridge> [ddnet] @heinrich5991 13:52 <+bridge> [ddnet] 13:52 <+bridge> [ddnet] can i make this variable, for example with %s? 13:52 <+bridge> [ddnet] 13:52 <+bridge> [ddnet] ```static const char *VANILLA_SKINS[] = {"bluekitty", "bluestripe", "brownbear", 13:52 <+bridge> [ddnet] "cammo", "cammostripes", "coala", "default", "limekitty", 13:53 <+bridge> [ddnet] "pinky", "redbopp", "redstripe", "saddo", "toptri", 13:53 <+bridge> [ddnet] "twinbop", "twintri", "warpaint", "x_ninja"};``` 13:53 <+bridge> [ddnet] i guess no, right? 13:53 <+bridge> [ddnet] you mean "can I output this variable with something like `%s` in `dbg_msg` and `str_format`"? 13:53 <+bridge> [ddnet] i mean, can we have like %s_cammo 13:53 <+bridge> [ddnet] just as an exmaple 13:53 <+bridge> [ddnet] like we do with str_format 13:55 <+bridge> [ddnet] you can do `str_format([โ€ฆ], "%s_%s", YourParameter, VANILLA_SKINS[3])` 13:56 <+bridge> [ddnet] that gives me a new possibility 13:56 <+bridge> [ddnet] let me try some 13:56 <+bridge> [ddnet] but 13:56 <+bridge> [ddnet] where do i need to place these lines? 13:58 <+bridge> [ddnet] I don't know what you want to do 13:58 <+bridge> [ddnet] probably near your other code 14:16 <+bridge> [ddnet] @heinrich5991 i wasnt able to do it 14:17 <+bridge> [ddnet] for me its too hard, maybe @deen can do something? :feelsgoodman: 17:02 <+Ryozuki> is there a patch containing the ddnet fifo implementation? to implement it on other mods 17:44 <+Ryozuki> timakro, hey :) 17:44 <+Ryozuki> heinrich5991, can u give voice to timakro 17:47 <+Ryozuki> (timakro): hello, is anybody aware of security issues with the teeworlds vanilla external console (econ)? just asking because its so old and rarely used, i dont trust it. 18:32 <@heinrich5991> timakro: I'm not aware of any 18:32 <@heinrich5991> just bind it to 127.0.0.1 and you're fine anyway 19:22 <+timakro> well, i want it to be accessible from another server 19:22 <+timakro> but its fine, just wanted to know if i missed anything well know, thanks ^^ 20:33 <+bridge> [ddnet] @heinrich5991 are you there? 20:33 <+bridge> [ddnet] @Bojidar Marinov yo 20:36 <+bridge> [ddnet] ey 20:36 <+bridge> [ddnet] every skin has its own number, right? 20:37 <+bridge> [ddnet] like the first skin (for example aaaaaaa) is number 0 20:37 <+bridge> [ddnet] because its the first 20:37 <+bridge> [ddnet] and if you have 100 skins the last (probably x_ninja) is 99, right? 20:38 <+bridge> [ddnet] yes, sounds reasonable 20:38 <+bridge> [ddnet] and if you have 100 skins the last (probably something like this zzz) is 99, right? 20:38 <+bridge> [ddnet] tkay 20:38 <+bridge> [ddnet] okay 20:38 <+bridge> [ddnet] how do i get the Number of the default skin? 20:39 <+bridge> [ddnet] because if you have a different amount of skins the number of the default skin will be anothsr one 20:39 <+bridge> [ddnet] i need a function or so to get it 20:39 <+bridge> [ddnet] use the Find function from the CSkins class 20:39 <+bridge> [ddnet] I think it should do it 20:39 <+bridge> [ddnet] with that i can get the index? 20:40 <+bridge> [ddnet] i guess it will look for the name 20:40 <+bridge> [ddnet] it returns the index, or -1 if none was found 20:40 <+bridge> [ddnet] yes 20:40 <+bridge> [ddnet] okay, i will try it. 20:42 <+bridge> [ddnet] you should refer to issues from your PR, so they would be auto-closed when it is merged: https://help.github.com/articles/closing-issues-using-keywords/ 20:44 <+bridge> [ddnet] oki 21:16 <+bridge> [ddnet] https://github.com/ddnet/ddnet/pull/1224/commits/59272476d697f2e8f1a5c35debe8b97acaacb746 21:16 <+bridge> [ddnet] 21:16 <+bridge> [ddnet] fixed it 21:18 <+bridge> [ddnet] that sounds like it makes every tee use the default skin if the user has a non-vanilla skin selected 21:19 <+bridge> [ddnet] fuck i am dumb 21:19 <+bridge> [ddnet] how do i resolve that 21:19 <+bridge> [ddnet] grrrrrr 21:20 <+bridge> [ddnet] @heinrich5991 :sendhelp: 21:22 <+bridge> [ddnet] it kinda sounds like you tackle it at the wrong level 21:23 <+bridge> [ddnet] the function already has a return value of `-1` if the skin cannot be found 21:23 <+bridge> [ddnet] yes 21:24 <+bridge> [ddnet] :pepeH: ?? 21:24 <+bridge> [ddnet] im confused 21:25 <+bridge> [ddnet] look at the call sites of `Find` 21:26 <+bridge> [ddnet] see what they do 21:27 <+bridge> [ddnet] ?^^ 21:27 <+bridge> [ddnet] you mean where Find gets called? 21:27 <+bridge> [ddnet] yes 21:28 <+bridge> [ddnet] ``` const CSkins::CSkin *pOwnSkin = m_pClient->m_pSkins->Get(m_pClient->m_pSkins->Find(Skin)); 21:28 <+bridge> [ddnet] ``` 21:28 <+bridge> [ddnet] this? 21:29 <+bridge> [ddnet] yes, this is one call site 21:30 <+bridge> [ddnet] I found another one in src/game/client/gameclient.cpp 21:30 <+bridge> [ddnet] ye 21:30 <+bridge> [ddnet] and what now? 21:32 <+bridge> [ddnet] i need more help xd 21:32 <+bridge> [ddnet] what do you see at the call site in gameclient.cpp? 21:32 <+bridge> [ddnet] what does the code do? 21:32 <+bridge> [ddnet] why do you see a default tee for other players (and not the first skin in your skin list)? 21:32 <+bridge> [ddnet] *for other players with skins that you don't have 21:34 <+bridge> [ddnet] it gets set 21:35 <+bridge> [ddnet] cant find it heinrich 21:35 <+bridge> [ddnet] oh wait 21:36 <+bridge> [ddnet] mhh 21:36 <+bridge> [ddnet] no 21:36 <+bridge> [ddnet] :/ 21:37 <+bridge> [ddnet] @heinrich5991 21:38 <+bridge> [ddnet] have you found the call site? 21:38 <+bridge> [ddnet] yes 21:40 <+bridge> [ddnet] ?? 21:41 <+bridge> [ddnet] what do you see there? 21:41 <+bridge> [ddnet] what do you mean 21:41 <+bridge> [ddnet] ``` 21:41 <+bridge> [ddnet] // find new skin 21:41 <+bridge> [ddnet] m_aClients[ClientID].m_SkinID = g_GameClient.m_pSkins->Find(m_aClients[ClientID].m_aSkinName); 21:41 <+bridge> [ddnet] if(m_aClients[ClientID].m_SkinID < 0) 21:41 <+bridge> [ddnet] { 21:41 <+bridge> [ddnet] m_aClients[ClientID].m_SkinID = g_GameClient.m_pSkins->Find("default"); 21:41 <+bridge> [ddnet] if(m_aClients[ClientID].m_SkinID < 0) 21:41 <+bridge> [ddnet] m_aClients[ClientID].m_SkinID = 0; 21:41 <+bridge> [ddnet] } 21:41 <+bridge> [ddnet] ``` 21:41 <+bridge> [ddnet] yes i see that 21:41 <+bridge> [ddnet] so what does the code do? 21:42 <+bridge> [ddnet] (can you describe it in words) 21:43 <+bridge> [ddnet] it sets the skin id to the id of the current skin and if the id is under 0 it sets the id to the id of the default skin 21:43 <+bridge> [ddnet] yea 21:43 <+bridge> [ddnet] what does it mean for the ID to be below zero? 21:44 <+bridge> [ddnet] -1 21:44 <+bridge> [ddnet] so the skin doesnt exist 21:44 <+bridge> [ddnet] yes 21:44 <+bridge> [ddnet] so at this call site, the "skin does not exist" case gets detected and the skin gets replaced by "default" 21:44 <+bridge> [ddnet] at our call site, which we want to fix, it looks like this; 21:44 <+bridge> [ddnet] at our call site, which we want to fix, it looks like this: 21:45 <+bridge> [ddnet] `const CSkins::CSkin *pOwnSkin = m_pClient->m_pSkins->Get(m_pClient->m_pSkins->Find(Skin));` 21:45 <+bridge> [ddnet] i.e. the `Get` function gets called with whatever we return from `m_pSkins->Find` 21:45 <+bridge> [ddnet] so what happens here if the skin does not exist? 21:47 <+bridge> [ddnet] it sets the skin to the first? 21:48 <+bridge> [ddnet] this is the observed behavior, but why? 21:48 <+bridge> [ddnet] but why does it happen? we call `m_pSkins->Get(-1)` 21:48 <+bridge> [ddnet] look at the `Get` function of `CSkins` 21:48 <+bridge> [ddnet] see what happens with the integer `-1` there 21:50 <+bridge> [ddnet] (in src/game/client/components/skins.cpp) 21:51 <+bridge> [ddnet] (what I'm trying to tell you here is how you can search around in code to understand behavior) 21:51 <+bridge> [ddnet] i see but im not understand the get function at this point 21:51 <+bridge> [ddnet] i see but i dont understand the get function at this point 21:52 <+bridge> [ddnet] yea, it's a bit convoluted: `return &m_aSkins[max(0, Index%m_aSkins.size())];` 21:53 <+bridge> [ddnet] `max(x, y)` gives the larger number of `x` and `y` 21:53 <+bridge> [ddnet] you can pretend for a moment that the function says `return &m_aSkins[max(0, Index)];` 21:53 <+bridge> [ddnet] why is there this & 21:55 <+bridge> [ddnet] that means "return a pointer to what is on the right" 21:55 <+bridge> [ddnet] ok, the important part there is `max(0, Index)` 21:55 <+bridge> [ddnet] this ensures that the index is not negative 21:56 <+bridge> [ddnet] i.e. if the index is negative, then 0 is the bigger number and gets used 21:56 <+bridge> [ddnet] otherwise, it's `Index` 21:56 <+bridge> [ddnet] ahh 21:56 <+bridge> [ddnet] so this is why it's the first skin in the list 21:56 <+bridge> [ddnet] i see 21:56 <+bridge> [ddnet] make sense 21:57 <+bridge> [ddnet] steps forward: change the call site that exhibits the bug 21:57 <+bridge> [ddnet] or change the `Get` function to return the default skin if it gets passed `-1` 21:57 <+bridge> [ddnet] thats probably the best 21:58 <+bridge> [ddnet] so wait 21:58 <+bridge> [ddnet] how exactly do i get that to work 21:59 <+bridge> [ddnet] you can check whether you get passed `-1` in `Get` 21:59 <+bridge> [ddnet] then you can look for a skin named `"default"` 21:59 <+bridge> [ddnet] `int CCollision::IntersectLineTeleHook(vec2 Pos0, vec2 Pos1, vec2 *pOutCollision, vec2 *pOutBeforeCollision, int *pTeleNr)` 21:59 <+bridge> [ddnet] whats that? 22:00 <+bridge> [ddnet] if you want to look for inspiration, check the call site in src/game/client/gameclient.cpp 22:00 <+bridge> [ddnet] @heinrich5991 :sendhelp: 22:00 <+bridge> [ddnet] ok 22:00 <+bridge> [ddnet] @ezy sounds like the function that takes hook movement and tells you where where it will be after the tick 22:00 <+bridge> [ddnet] e.g. applying hook teleporters 22:00 <+bridge> [ddnet] but in gameclient theyre working with clientids 22:01 <+bridge> [ddnet] or hitting walls 22:01 <+bridge> [ddnet] what do you use for editing the source, @fokkonaut ? 22:01 <+bridge> [ddnet] msvc? 22:01 <+bridge> [ddnet] msvs 22:02 <+bridge> [ddnet] then you can probably right-click `m_SkinID` of `m_aClients[ClientID].m_SkinID = g_GameClient.m_pSkins->Find(m_aClients[ClientID].m_aSkinName);` and select something like "go to definition" 22:03 <+bridge> [ddnet] it leads me to gameclient.h 22:03 <+bridge> [ddnet] what does it say about `m_SkinID`? 22:04 <+bridge> [ddnet] nothing 22:04 <+bridge> [ddnet] huh 22:05 <+bridge> [ddnet] I see something about `m_SkinID` there: `int m_SkinID;` in `struct CClientData` 22:06 <+bridge> [ddnet] so it's just assigning it to an `int` of some unrelated structure 22:06 <+bridge> [ddnet] you can just use a local `int` variable instead 22:06 <+bridge> [ddnet] oh 22:07 <+bridge> [ddnet] how does this help with the Get function 22:07 <+bridge> [ddnet] im confusd again xd 22:08 <+bridge> [ddnet] what happens in the `Get` function when our bug triggers? 22:08 <+bridge> [ddnet] what's the value of the variable `Index`? 22:09 <+bridge> [ddnet] -1 22:09 <+bridge> [ddnet] yes 22:09 <+bridge> [ddnet] we want to do something different from the normal get function in this case 22:09 <+bridge> [ddnet] how can we do this? 22:10 <+bridge> [ddnet] what programming construct allows us to choose different code paths depending on a condition? 22:10 <+bridge> [ddnet] Switch? 22:10 <+bridge> [ddnet] yes, one of them. but I ment `if` 22:10 <+bridge> [ddnet] in this case 22:10 <+bridge> [ddnet] so we're using `if(Index == -1)` 22:10 <+bridge> [ddnet] and then choose to do things differently 22:11 <+bridge> [ddnet] we want to look for a skin named `"default"`, how do we do this? @fokkonaut 22:11 <+bridge> [ddnet] (you can look at the src/game/client/gameclient.cpp code) 22:11 <+bridge> [ddnet] Find("default") 22:12 <+bridge> [ddnet] okay. what does `Find("default")` return? 22:12 <+bridge> [ddnet] index of default skin 22:12 <+bridge> [ddnet] yep 22:13 <+bridge> [ddnet] what do we want to return? 22:13 <+bridge> [ddnet] the id 22:13 <+bridge> [ddnet] not really, we get passed the ID and return some kind of pointer 22:13 <+bridge> [ddnet] so now we have to do something to the ID of the default skin to get to the pointer 22:14 <+bridge> [ddnet] but the rest of the function already does that for us 22:14 <+bridge> [ddnet] so we can just set `Index` to `Find("default")` in that if, and skins that were not found will be replaced by the default skin 22:16 <+bridge> [ddnet] wut 22:17 <+bridge> [ddnet] that was too fast @heinrich5991 22:18 <+bridge> [ddnet] do you see the signature of the function? 22:18 <+bridge> [ddnet] `const CSkins::CSkin *CSkins::Get(int Index)` 22:18 <+bridge> [ddnet] what funciton 22:18 <+bridge> [ddnet] `Get` 22:18 <+bridge> [ddnet] oh 22:19 <+bridge> [ddnet] it says that it takes an `int` and returns a `const CSkins::CSkin *` 22:19 <+bridge> [ddnet] is that clear (even if we might not know what a `const CSkins::CSkin *` is) 22:19 <+bridge> [ddnet] ? 22:20 <+bridge> [ddnet] yes 22:20 <+bridge> [ddnet] okay 22:20 <+bridge> [ddnet] so whatever we do to that function, it still has to take an `int` and return a `const CSkins::CSkin *` 22:20 <+bridge> [ddnet] we're currently at 22:20 <+bridge> [ddnet] yed 22:21 <+bridge> [ddnet] ye 22:21 <+bridge> [ddnet] ``` 22:21 <+bridge> [ddnet] if(Index == -1) 22:21 <+bridge> [ddnet] { 22:21 <+bridge> [ddnet] // something with Find("default") 22:21 <+bridge> [ddnet] } 22:21 <+bridge> [ddnet] return &m_aSkins[max(0, Index%m_aSkins.size())]; 22:21 <+bridge> [ddnet] ``` 22:21 <+bridge> [ddnet] we want to do something differently if the given index is `-1` 22:22 <+bridge> [ddnet] Great news! I got multi-layer editing up and running ๐Ÿ˜ƒ 22:22 <+bridge> [ddnet] oh wow, you're fast ๐Ÿ™‚ 22:22 <+bridge> [ddnet] a good amount of the code was already there ๐Ÿ˜‰ 22:22 <+bridge> [ddnet] nice 22:22 <+timakro> love your patience heinrich, nice coding lessons :D 22:22 <+bridge> [ddnet] @fokkonaut do you see how I arrived at the code skeleton above? 22:22 <+bridge> [ddnet] i guess y 22:23 <+bridge> [ddnet] so look 22:23 <+bridge> [ddnet] better check for index < 0, not for index == -1 22:23 <+bridge> [ddnet] ``` if(Index == -1) 22:23 <+bridge> [ddnet] { 22:23 <+bridge> [ddnet] Index = Find("default"); 22:23 <+bridge> [ddnet] } 22:23 <+bridge> [ddnet] return &m_aSkins[max(0, Index%m_aSkins.size())];``` 22:23 <+bridge> [ddnet] i have it like this now 22:23 <+bridge> [ddnet] ok @Bojidar Marinov 22:24 <+timakro> Are you working on the map editor? may i ask what multilayer editing is roughly? 22:24 <+bridge> [ddnet] index < -1 is a bug anyway ^^ 22:24 <+bridge> [ddnet] `index < -1` is a bug anyway ^^ 22:24 <+bridge> [ddnet] ? 22:24 <+bridge> [ddnet] ah 22:24 <+bridge> [ddnet] so -1 or <0? 22:24 <+bridge> [ddnet] idc 22:24 <+bridge> [ddnet] i will use < 0 22:25 <+bridge> [ddnet] i have seen it in gameclient.cpp too 22:25 <+bridge> [ddnet] <0 is more future-proof, in case we decide to use -2 for some other error code 22:25 <+bridge> [ddnet] then you'd hopefully check all call sites! 22:25 <+bridge> [ddnet] but okay, it makes sense to mirror the other call sites 22:25 <+bridge> [ddnet] is that right like it is now? 22:25 <+bridge> [ddnet] kinda 22:25 <+bridge> [ddnet] but dont tell me thats it xD 22:26 <+bridge> [ddnet] we're only missing handling if the `"default"` skin cannot be found 22:26 <+bridge> [ddnet] that's basically it 22:26 <+bridge> [ddnet] ah 22:26 <+bridge> [ddnet] what gameclient.cpp does is that it uses the first skin (index 0) if `"default"` cannot be found 22:26 <+bridge> [ddnet] that sounds reasonable 22:27 <+bridge> [ddnet] yep 22:27 <+bridge> [ddnet] so that is this: ``` if(m_aClients[ClientID].m_SkinID < 0) 22:27 <+bridge> [ddnet] m_aClients[ClientID].m_SkinID = 0;``` 22:27 <+bridge> [ddnet] yes 22:27 <+bridge> [ddnet] you have to adapt it for our code, obviously ^^ 22:27 <+bridge> [ddnet] place inside the if? 22:28 <+bridge> [ddnet] or under it 22:28 <+bridge> [ddnet] I'd put it inside the if 22:28 <+bridge> [ddnet] because it's what we want to do if the above fails 22:28 <+bridge> [ddnet] ye 22:28 <+bridge> [ddnet] ``` if(Index < 0) 22:28 <+bridge> [ddnet] { 22:28 <+bridge> [ddnet] Index = Find("default"); 22:28 <+bridge> [ddnet] 22:29 <+bridge> [ddnet] if (Index < 0) 22:29 <+bridge> [ddnet] Index = 0; 22:29 <+bridge> [ddnet] } 22:29 <+bridge> [ddnet] return &m_aSkins[max(0, Index%m_aSkins.size())];``` 22:29 <+bridge> [ddnet] what is a good limit for the amount of layers edited at once? 22:29 <+bridge> [ddnet] @Bojidar Marinov unlimited 22:29 <+bridge> [ddnet] 100 22:29 <+timakro> test 22:29 <+bridge> [ddnet] 128 22:29 <+bridge> [ddnet] hope no one makes that one function recursive, then 22:29 <+bridge> [ddnet] @heinrich5991 its right like i showed? 22:29 <+bridge> [ddnet] xD 22:30 <+bridge> [ddnet] yes. we can remove the `max` now 22:30 <+bridge> [ddnet] i.e. 22:30 <+bridge> [ddnet] what is i.e. 22:30 <+bridge> [ddnet] roughly "in other words", or the german "das heiรŸt" 22:31 <+bridge> [ddnet] oh ok 22:31 <+bridge> [ddnet] the return will be just `return &m_aSkins[Index % m_aSkins.size()];` 22:31 <+bridge> [ddnet] done 22:32 <+bridge> [ddnet] and we can reduce the code at the gameclient call site 22:32 <+bridge> [ddnet] in wiefern @heinrich5991 22:32 <+bridge> [ddnet] @Bojidar Marinov Are you working on the map editor? can you briefly tell me what this multi layer feature is? im interested 22:33 <+bridge> [ddnet] is it about editing multiple layers at once? 22:33 <+bridge> [ddnet] @heinrich5991 ``` if(m_aClients[ClientID].m_SkinID < 0) 22:33 <+bridge> [ddnet] { 22:33 <+bridge> [ddnet] m_aClients[ClientID].m_SkinID = g_GameClient.m_pSkins->Find("default"); 22:33 <+bridge> [ddnet] if(m_aClients[ClientID].m_SkinID < 0) 22:33 <+bridge> [ddnet] m_aClients[ClientID].m_SkinID = 0; 22:33 <+bridge> [ddnet] }``` 22:33 <+bridge> [ddnet] remove that because we have it in Get? 22:33 <+bridge> [ddnet] @timakro yep it is 22:33 <+bridge> [ddnet] @fokkonaut yes, exactly ๐Ÿ˜ƒ 22:34 <+bridge> [ddnet] so you can make design and game layer in one go? 22:34 <+bridge> [ddnet] @fokkonaut yes, exactly ๐Ÿ™‚ 22:34 <+bridge> [ddnet] only if you have set up some tiles in your map, as a brush 22:34 <+bridge> [ddnet] i think its for copying multiple layers at once 22:34 <+bridge> [ddnet] afaik, the space select is disabled 22:34 <+bridge> [ddnet] @heinrich5991 it works nicely ๐Ÿ˜ƒ was that it? 22:36 <+bridge> [ddnet] that multilayer feature was requested forever, looking forward to it 22:36 <+bridge> [ddnet] yes, it is for editing multiple layers at once, mainly for moving exisiting parts around 22:37 <+bridge> [ddnet] @fokkonaut there's another call site that needs fixing 22:37 <+bridge> [ddnet] in src/game/client/components/ghost.cpp 22:38 <+bridge> [ddnet] ok 22:38 <+bridge> [ddnet] im in 22:38 <+bridge> [ddnet] remove that ``` if(SkinId < 0) 22:38 <+bridge> [ddnet] { 22:38 <+bridge> [ddnet] SkinId = m_pClient->m_pSkins->Find("default"); 22:38 <+bridge> [ddnet] if(SkinId < 0) 22:38 <+bridge> [ddnet] SkinId = 0; 22:38 <+bridge> [ddnet] }``` 22:38 <+bridge> [ddnet] yes ๐Ÿ™‚ 22:39 <+bridge> [ddnet] thats it 22:40 <+bridge> [ddnet] so i will pr this now 22:40 <+bridge> [ddnet] yes ๐Ÿ™‚ 22:44 <+bridge> [ddnet] @heinrich5991 i guess you can merge it 22:44 <+bridge> [ddnet] ha, my multilayer implementation has a slight misfeature -- it works even on quad layers 22:44 <+bridge> [ddnet] not sure if I should keep this :] 22:44 <+bridge> [ddnet] @heinrich5991 may i ask why you dont merge your own UI stuff= 22:44 <+bridge> [ddnet] @heinrich5991 may i ask why you dont merge your own UI stuff? 22:45 <+bridge> [ddnet] because I wrote it 22:45 <+bridge> [ddnet] and someone else should look over it 22:45 <+bridge> [ddnet] i tested it :p 22:45 <+bridge> [ddnet] xD 22:46 <+bridge> [ddnet] yes, someone who is a reviewer 22:46 <+bridge> [ddnet] you can e.g. ping Learath2 if you want it merged sooner 22:46 <+bridge> [ddnet] I tested the multilayer editing on Kobra 4 and Goo!, still not sure it works correctly in all cases (and doesn't crash, hehe) 22:46 <+bridge> [ddnet] would deen also work? 22:46 <+bridge> [ddnet] ah hes offline again 22:47 <+bridge> [ddnet] well, the forward to IRC means that we already pinged both of them ๐Ÿ˜ฆ 22:47 <+bridge> [ddnet] xD 22:47 <+bridge> [ddnet] going to push and PR what I've got, since, you know, "release early, release often" 22:47 <+bridge> [ddnet] sure, go ahead, @Bojidar Marinov 22:48 <+bridge> [ddnet] are there any mappers who know how to compile the DDNet client by hand? I think it would be nice to get some feedback 22:48 <+bridge> [ddnet] me 22:48 <+bridge> [ddnet] i used to create some maps, i will try it out 23:01 <+bridge> [ddnet] @fokkonaut @timakro Created the pull request, you might follow https://help.github.com/articles/checking-out-pull-requests-locally/ in order to pull the changes locally 23:01 <+bridge> [ddnet] (or just go over to my repository, select the correct branch, and click Download) 23:02 <+bridge> [ddnet] (i think they know how to do that) 23:02 <+bridge> [ddnet] (better safe than sorry) 23:02 <+bridge> [ddnet] (np 23:02 <+bridge> [ddnet] ) 23:03 <+bridge> [ddnet] wait i have a good one 23:03 <+bridge> [ddnet] https://www.xkcd.com/859/ 23:03 <+bridge> [ddnet] been there seen that 23:04 <+bridge> [ddnet] xD 23:06 <+bridge> [ddnet] what branch is it 23:06 <+bridge> [ddnet] hm, so how do i get started in the editor? 23:06 <+bridge> [ddnet] the branch is the one starting with 486 23:07 <+bridge> [ddnet] git remote add bojidar git@github.com:bojidar-bg/ddnet.git 23:07 <+bridge> [ddnet] @timakro to enable multi-layer, just shift-click a few layers 23:07 <+bridge> [ddnet] git fetch 23:07 <+bridge> [ddnet] git checkout 486-multilayer-editing 23:07 <+bridge> [ddnet] git fetch bojidar 23:07 <+bridge> [ddnet] anyway, I'm going off to ~~that dreamy thing~~ sleep, if you spot anything odd, comment on the issue or mention me here ๐Ÿ˜ƒ 23:07 <+bridge> [ddnet] good night ๐Ÿ™‚ 23:07 <+bridge> [ddnet] cya 23:08 <+bridge> [ddnet] git fetch https://github.com/ddnet/ddnet pulls/1227/head 23:08 <+bridge> [ddnet] git checkout FETCH_HEAD 23:08 <+bridge> [ddnet] meh, forgot the monero miner again ๐Ÿ˜‰ 23:08 <+bridge> [ddnet] jk 23:10 <+bridge> [ddnet] a crypto miner 23:11 <+bridge> [ddnet] @Bojidar Marinov okay, nice works generally. issues i see at first glance: 23:11 <+bridge> [ddnet] - layers need to be in the same group 23:11 <+bridge> [ddnet] - when you pick tiles from the "space" selection things dont make sense, maybe this should be disabled (or maybe there is another clever use for that) 23:12 <+bridge> [ddnet] @timakro best to post these things into the PR 23:12 <+bridge> [ddnet] sure, sec 23:12 <+bridge> [ddnet] (apparently they're not offline yet :D) 23:12 <+bridge> [ddnet] ^^ 23:12 <+bridge> [ddnet] (but might still make a good reminder) 23:13 <+bridge> [ddnet] 1) no sane way around, especially if Parallax is on 23:13 <+bridge> [ddnet] 2) yeah, noticed it somehow still gets triggered, going to look into it tomorrow 23:13 <+bridge> [ddnet] 3) it's a he 23:13 <+bridge> [ddnet] 1) no sane way around, especially if Parallax is on 23:13 <+bridge> [ddnet] 2) yeah, noticed it somehow still gets triggered, going to look into it tomorrow 23:13 <+bridge> [ddnet] (3) it's a he) 23:14 <+bridge> [ddnet] still, feel free to comment on the PR 23:14 <+bridge> [ddnet] well, you could just ignore parallax (or disable it but i dont think thats worth it) 23:15 <+bridge> [ddnet] oh my god *-* 23:15 <+bridge> [ddnet] ignoring parallax doesn't sounds like a good idea 23:15 <+bridge> [ddnet] its perfect xd 23:15 <+bridge> [ddnet] improve it and it will be very perfect 23:15 <+bridge> [ddnet] well, by ignoring i mean it just wouldnt make sense to use it with parallax then 23:15 <+bridge> [ddnet] ofc you could also disable it for groups with different parallax but thats a stupid limitation 23:16 <+bridge> [ddnet] nah, that sounds like the right thing to do, to me 23:17 <+bridge> [ddnet] yeah no problem for me, just little more code preventing that 23:17 <+bridge> [ddnet] it would be super nice to have it work for tile and game layer 23:19 <+bridge> [ddnet] https://www.reddit.com/r/learnprogramming/comments/2c9slr/why_does_gits_man_page_say_the_stupid_content/ 23:19 <+bridge> [ddnet] @heinrich5991 how would we make the vanilla+prefix to work together? 23:24 <+bridge> [ddnet] that sounds like a harder problem 23:24 <+bridge> [ddnet] mh. wait 23:25 <+bridge> [ddnet] oh noes ddnet is down 23:26 <+bridge> [ddnet] ddnet.tw 23:26 <+bridge> [ddnet] nope 23:27 <+bridge> [ddnet] @fokkonaut line 212 in src/game/client/components/skins.cpp could use our new variable `m_IsVanilla` as well 23:28 <+bridge> [ddnet] and you could reorder line 65 to before `m_OrgTexture` (same in the header file), so that initialization order is consistent 23:28 <+bridge> [ddnet] (just style, this doesn't make the current program wrong) 23:28 <+bridge> [ddnet] so is it neccessary or can you do it afterwards?^^ 23:29 <+bridge> [ddnet] mhmh 23:30 <+bridge> [ddnet] it would be nice if you could still do that 23:30 <+bridge> [ddnet] ok sec 23:32 <+bridge> [ddnet] what do you mean with the 212 23:32 <+bridge> [ddnet] replace `!IsVanillaSkin(m_aSkins[i].m_aName)` by `!m_aSkins[i].m_IsVanilla` 23:33 <+bridge> [ddnet] oki 23:34 <+bridge> [ddnet] ``` struct CSkin 23:34 <+bridge> [ddnet] { 23:34 <+bridge> [ddnet] bool m_IsVanilla; 23:34 <+bridge> [ddnet] int m_OrgTexture; 23:34 <+bridge> [ddnet] int m_ColorTexture; 23:34 <+bridge> [ddnet] char m_aName[24]; 23:34 <+bridge> [ddnet] vec3 m_BloodColor; 23:34 <+bridge> [ddnet] 23:34 <+bridge> [ddnet] bool operator<(const CSkin &Other) { return str_comp(m_aName, Other.m_aName) < 0; } 23:34 <+bridge> [ddnet] };``` 23:34 <+bridge> [ddnet] header 23:34 <+bridge> [ddnet] yes ๐Ÿ™‚ 23:34 <+bridge> [ddnet] ``` CSkin Skin; 23:34 <+bridge> [ddnet] Skin.m_IsVanilla = IsVanillaSkin(aFilenameWithoutPng); 23:34 <+bridge> [ddnet] Skin.m_OrgTexture = pSelf->Graphics()->LoadTextureRaw(Info.m_Width, Info.m_Height, Info.m_Format, Info.m_pData, Info.m_Format, 0); 23:34 <+bridge> [ddnet] ``` 23:34 <+bridge> [ddnet] yes 23:34 <+bridge> [ddnet] pr? 23:35 <+bridge> [ddnet] just add it to the existing one ^^ 23:35 <+bridge> [ddnet] or have you removed your ability to do so in some way? 23:36 <+bridge> [ddnet] xd 23:40 <+bridge> [ddnet] done btw 23:40 <+bridge> [ddnet] @heinrich5991 how would we make the vanilla+prefix to work together? 23:42 <+bridge> [ddnet] haha apparently you can crash the editor by making an automapper with a `[section]` line 23:42 <+bridge> [ddnet] lol 23:43 <+Songoku> what is it with ddnet? Its laggy for weeks now... 23:43 <+bridge> [ddnet] typo 23:43 <+bridge> [ddnet] without xD 23:43 <+bridge> [ddnet] haha apparently you can crash the editor by making an automapper without a `[section]` line 23:43 <+bridge> [ddnet] this crashes it 23:43 <+bridge> [ddnet] ``` 23:43 <+bridge> [ddnet] Index 1 23:43 <+bridge> [ddnet] Pos 0 0 EMPTY 23:43 <+bridge> [ddnet] ``` 23:47 <@heinrich5991> Songoku: it's under attack :/ 23:47 <+Songoku> heinrich5991: ddos? Any idea by whom? 23:48 <@heinrich5991> yes, ddos 23:49 <+Songoku> heinrich5991: is there nothing, we can do? 23:49 <@heinrich5991> I don't know. I understand the problem too little right now 23:50 <@heinrich5991> de*en explained to me today what specifically hits our servers right now 23:50 <+Songoku> what is it? 23:52 <@heinrich5991> apparently we're cpu-bound right now 23:54 <+Songoku> sounds like a lack of server services, would it be better if we spend more money... 23:55 <@heinrich5991> thought about that as well 23:59 <+bridge> [ddnet] is there some kind of mod api that makes it easy to create new gametype concepts 23:59 <+Songoku> at some point does calling the police make sense?