Time Nick Message 03:58 MTDiscord Centos 6 and Ubuntu I think 16.04 will miss us, but no biggie 14:29 erlehmann test 14:29 MTDiscord success! 14:29 MTDiscord Test failed successfully 14:30 erlehmann I have decided to no longer bitch about wrong boundaries, but just provide well-tested patches. here is the first: https://github.com/minetest/minetest/issues/11828#issuecomment-993594718 14:30 erlehmann that way i do useful work and do not go on ppls nerves 14:30 erlehmann celeron55 does this count as a trivial patch that can be merged or should make a PR? 14:31 erlehmann it fixes 11828 and also mineclonia issue 183 14:37 erlehmann I think the solution to modders misusing version strings to check for features isn't to withhold the version strings, but to make it easier to check for features 14:37 erlehmann i think the solution is to actually withhold the version string AND make it easier to check for features 14:37 erlehmann otherwise some lazy person is going to use the versoin string 14:40 MTDiscord Heh, that only works if MT actually knows what features it has. We would need like has_entity_attachments, entity_attachments_fixed, entity_attachments_working_again, entity_attachments_really_fixed_now_this_time_for_sure... 14:41 MTDiscord As a gamedev the reason I need to know the version is not to know what APIs MT supports, it's to find out how those APIs actually behave so I can decide whether they're buggy enough I need to rely on fallback behavior. 14:42 MTDiscord That's not a thing you'll be able to just "fix", either, it's an inevitability of ongoing changes to the engine and its environment. 14:42 erlehmann coming from web development, i think fallback behaviour is almost always the wrong solution 14:42 erlehmann progressive enhancement is the correct solution. what others see as fallback behaviour becomes the baseline, you layer your solution on top of it. 14:42 erlehmann that way, it always works, built up from the lowest common denominator. 14:43 erlehmann i.e. code your page in html, then apply css, then apply js. the html version must be fully working before you do the latter steps. 14:43 erlehmann it means whenever js fails, it is likely that the plain html will still work. 14:44 erlehmann bad web devs do the js thing first and then redirect to some stripped-down page that inevitably sucks or is eventually deprecated. 14:49 celeron55 they don't even redirect you to anything these days 14:49 celeron55 they just say "no content for you. go download the newest browser from our favourite vendor" 14:49 rubenwardy I think it depends on the website 14:50 rubenwardy that makes sense for a news website - but not for a social network. Social networks are inherently interactive, making them work with no JS desn't make sense 14:50 rubenwardy the sort of person that disables JS also probably doesn't use social networks 14:51 celeron55 well, sometimes i have to use facebook marketplace to get something, and F5 would provide me all the interactivity i'd need 14:51 celeron55 same thing goes for almost everything 14:51 celeron55 even discord would be fine with just F5 14:51 MTDiscord some websites don't even show a message when javascript is disabled, they just give you a blank page or gray boxes where content should be 14:52 MTDiscord erlehmann, sounds like you're saying the same thing that I'm saying but with different words. I want to progressively enhance what my mods do. 14:53 celeron55 anything that literally needs javascript to be useful is basically a video game 14:53 MTDiscord There are cases where I have to choose to either use feature A or feature B (where one of those might be "nothing" if there is no option that's beneficial). Whether you call one of those a "fallback" or the "baseline" doesn't really change the API surface that I would need to achieve that. 14:58 MTDiscord I actually have a counter-case re: the JS thing. I would actually prefer that websites be designed to deliver essentially a static client-side app that then talks to a JSON API on the back-end. I hate having to scrape through messy pre-baked HTML trying to script anything, and sites that are API-based can be easier to work with, depending on how they auth. 14:59 MTDiscord CDB is a good example of a compromise, in that it offers both a JSON API and pre-baked HTML views. For services that can't afford to maintain both, I'd probably rather have the JSON API if I want to seriously use it long-term. 15:01 MTDiscord For a news site ... I want RSS or Atom. I've had RSS/Atom support for CDB on my todo list for ... a long time. 15:16 erlehmann Warr1024 i have been a backend developer. i know how to do this! you can see it with my personal page: http://news.dieweltistgarnichtso.net/bin 15:16 erlehmann it generates an atom xml feed first and then applies a stylesheet to it to get the xhtml out of it 15:17 erlehmann that way the feed always works, since there is only one code path 15:18 erlehmann i have also made a backend service for a customer that delivers json responses and then depending on the content type that the browser wanted, i gave out a html rendering of it. i can help you if you want to make something like this. 15:19 erlehmann Warr1024 you say you have atom support for cdb on your todo list. if i offer help, who is the maintainer? 15:19 erlehmann > Social networks are inherently interactive, making them work with no JS desn't make sense 15:20 erlehmann that is not true, you can use the fediverse wih it. also, you can have continuously updating content without js. otherwise early webcams would never have worked 15:22 erlehmann rubenwardy with this short shell script and djb's tcpserver you can monitor a file and push updates over http to the client http://news.dieweltistgarnichtso.net/bin/httptaild 15:23 erlehmann it uses tail -f and chunked encoding, works pretty much everywhere i have tried without any js 15:23 rubenwardy not sure why I'd need that 15:24 rubenwardy I'm the maintainer of ContentDB, the issue is: https://github.com/minetest/contentdb/issues/224 15:24 erlehmann oh i know python, good 15:25 erlehmann i rather use bottle.py than flask but i guess i can figure it out, thanks 15:26 rubenwardy never heard of that one 15:26 rubenwardy eh, WSGI 15:26 rubenwardy I prefer to run stuff separately from nginx, and use nginx as a reverse proxy 15:26 erlehmann bottle.py fills the same niche as flask, just differently opinionated 15:26 erlehmann a very small web framework 15:26 erlehmann single file 15:27 rubenwardy well, wsgi is a standard and not necessarily tied to nginx 15:27 erlehmann yes 15:27 erlehmann very good 15:27 rubenwardy If I were to remake ContentDB, I'd be tempted to use a more complicated framework like Django 15:27 rubenwardy or NodeJS 15:27 erlehmann btw, regarding turning off javascript: try opening 20 tabs on a modern computer with no js blocked. like 20 tabs of youtube. now try it with a proper script blocker. the difference is your computer lagging itself to death or not. 15:27 rubenwardy my computer handles that fine 15:28 MTDiscord same 15:28 erlehmann people always say that but then they run some ad blockers that block a lot of js anyway 15:28 rubenwardy Firefox aggressively sleeps tabs 15:28 rubenwardy yeah I also use an adblocker because I'm personally not a fan of viruses 15:28 erlehmann not a fan? 15:29 erlehmann i am waiting for someone to claim ”i do not use an adblocker, because it is untested experimental technology and it changes the code on my computer PERMANENTLY” ^^ 15:30 erlehmann i trust my natural malware immunity xD 16:44 sfan5 when I first read #11634 I thought that was stupid but I suddenly need one myself 16:44 ShadowBot https://github.com/minetest/minetest/issues/11634 -- Custom error handler 16:45 sfan5 sadly this doesn't seem to be easy to implement 17:03 sfan5 oh god I hate async programming in lua 17:03 rubenwardy are you using callbacks or coroutines? 17:03 rubenwardy not that it makes too much difference 17:04 sfan5 former 17:07 Fleckenstein do you like JavaScript async programming better? 17:08 sfan5 without await it's the exact same mess 17:08 sfan5 with await, yes obviously 17:09 Fleckenstein https://github.com/EliasFleckenstein03/lua_async 17:09 Fleckenstein it got await 17:09 Fleckenstein the error messages suck however 17:10 Fleckenstein and it does not seem to work with non-LuaJIT MT for some reason 17:10 sfan5 I suppose coroutines allow making this less painful? haven't ever messed with them 17:14 Fleckenstein yes 17:14 Fleckenstein lua_async internally uses coroutines 18:20 sfan5 okay let's see if I can make this work using coroutines 18:20 sfan5 because that'd be much nicer 18:54 sfan5 static int ScriptApiBase::luaPanic(lua_State*): A fatal error occurred: LUA PANIC: unprotected error in call to Lua API (bad argument #5 to '?' (function expected, got table)) 18:54 ShadowBot https://github.com/minetest/minetest/issues/5 -- Fixed key names so the key set menu now works. by adamnew123456 18:54 sfan5 is this a good sign? 18:56 rubenwardy haha sounds about right 19:04 erlehmann what exactly is preventing https://github.com/minetest/minetest/pull/11858 from being merged as a trivial bugfix? there are no performance arguments here, bounds checking is done anyways. it is only that the current number makes code buggy that previously was not. 19:06 erlehmann i think most of the debates regarding where the world “should” end do not address real-world problems, i.e. game-breaking behaviour. 19:09 MTDiscord Heh, I actually ran into a related problem a layer of abstraction up. I want all of my logic that checks for nodes in areas or specific places to "abort" if it encounters an unloaded area, i.e. stop executing that specific registered callback for that position, but continue on to the next one. 19:09 erlehmann Warr1024 do you know if the breaking of lua mapgen at map boundaries affects lighting? 19:10 MTDiscord The usual way to do this is just having to check for node.name == "ignore" or (not get_node_or_nil(...)) etc but obviously this is not an abstraction, so it's dependent on me remembering to consistently do this everywhere, and if I need to change the pattern, then I have to update thousands of lines of code. 19:10 erlehmann i am thinking of the end dimension in MCL* in particular 19:10 erlehmann it is technically underground 19:10 MTDiscord The only lua mapgen I do is substitutions so I don't know. 19:11 erlehmann oh, but substitutions are exactly what fail now 19:11 erlehmann if you find them with minetest.find_nodes_in_area() 19:11 MTDiscord I only do my lua mapgen using the mapgen vmanip, so no. 19:12 erlehmann oh, right, they have not broken that … yet 19:12 erlehmann lol 19:12 MTDiscord patience 19:13 erlehmann what i hate in particular about this situation is that one value is practically better (less bugs) and the other is only an aesthetic choice (as there is no logical connection to use mapgen limit for this) 19:13 erlehmann aesthetics (yay. using the same limit everywhere) should not trump ethics (not breaking games) 19:13 MTDiscord I think I also assume that areas outside of the mapchunk I'm given do not really exist, so I do kludgey stuff near mapchunk boundaries where I can't safely make assumptions about whether anything exists on the other side, so there are probably 2-wide planes for instance that don't generate lode ore every 80m because there's no way for me to be sure they wouldn't be exposed to air... 19:14 erlehmann that's fair. i mean i would not decay farmland near ignore nodes because those might hold water when loaded. 19:15 erlehmann i have looked at wuzzy mine shaft generation and if i remember it correctly, it starts in the middle of a mapblock and works itself outwards. similar approach i guess. 19:16 MTDiscord Haha, yeah, the problem is I just have to go back and audit 20kLOC of game code for places where I need unloaded checks, and then once I do that doesn't absolutely prevent me from making the same mistake again later. I want there to be an abstraction that I can just use and it will handle all the subtleties for me. 19:16 MTDiscord I've got some hacks that would probably work but their perf costs are pretty significant. 19:18 MTDiscord re: mapgen, also, there's one reason to always stick to only inside-mapchunk stuff and never even attempt to look at neighboring mapchunks even if they might be loaded: it helps ensure that maps always generate as close as possible to the same way regardless of the path by which they're explored. 19:18 erlehmann oh yeah, i have noticed that some code, like village generation, will be different depending on how i approach some area. but that's not for the engine to solve, it is a mod problem. 19:19 sfan5 apparently the mere presence of coroutines totally prevents certain callback things from working 19:19 MTDiscord I was so thrilled when dungeons finally started generating repeatably in 5.3 that I went and reworked all the lua mapgen so all that stuff is repeatable per seed as well :-D 19:19 sfan5 welp 19:23 erlehmann sfan5 i do not understand https://github.com/minetest/minetest/pull/11858#issuecomment-993818705 – the code is buggy right now and the patch fixes it for *all* possible scenarios as far as i see. any discussion of the map boundaries should be subordinate to fixing bugs introduced by an improper understanding of the map boundaries IMO. 19:24 erlehmann you can still move it to whatever value later (introducing new bugs if not careful, or none if everything except the mapgen has the same boundary) 19:25 erlehmann (unless the mapgen boundary is higher than whatever the other value is, of course) 19:26 erlehmann so what is gained by discussing where the boundaries should be (again) now except stalling the obvious bugfix? 19:27 erlehmann FYI: Fleckenstein convinced me that i should not make a game crash if code i am not responsible for misbehaves. it is an issue of ownership after all. 19:28 sfan5 if you want something post in the issue, I don't want to talk about it now or here 19:28 erlehmann ok 19:29 erlehmann sorry 19:34 MTDiscord sfan5, if you want sane-looking lua async code, you could look for a library that does promises so you can do like a .then(function()...end).then(function()...end) sort of thing. Uglier than async, but not as bad as nested chains of callbacks in my experience. 19:35 MTDiscord that, at least should not require coros either. 19:40 Fleckenstein Warr1024, i provide such a library 19:40 Fleckenstein i linked it to sfan5 earlier 19:41 Fleckenstein but i think he wants to make his own with coros 19:42 sfan5 Fleckenstein: here's what I came up with https://github.com/minetest/minetest/pull/11859/files#diff-99c99abc6a9c22c20d2d88aaf961847b7d82e23d9e97e43cea691054ba26ecbaR27-R48 19:42 MTDiscord yeah, but then he said that coros break everything so ? 19:42 MTDiscord but on the other hand, that promise library looks nice anyway and I wonder if I can use it for something... 19:42 sfan5 in case it doesn't link properly that's the `local function await(invoke)` 19:43 Fleckenstein yea, it's probably better to use this instead of including a library for it 19:44 Fleckenstein test this with plain lua as well as with LuaJIT tho, i've had problems with coros on Minetest + Plain Lua 19:44 Fleckenstein it works with Plain Lua or with Minetest + LuaJIT, but not with Minetest + Plain Lua for some reason 19:45 sfan5 the CI build that also runs the test is without luajit, so let's see 19:46 sfan5 and for @Warr1024 this is what my async-proof function looked https://github.com/sfan5/minetest/blob/eab4c79df3cd32dfe451982f138b39f6d96e2f45/games/devtest/mods/unittests/init.lua#L96-L160 19:49 sfan5 I wonder how an embedding application is supposed to handle a closure being created inside a coroutine that is supposed to be called while the coroutine is suspended 19:49 sfan5 because that's what causes the lua panic I showed earlier 19:49 sfan5 putting it into core.after() is somehow no problem (because it's plain Lua?) 19:51 sfan5 Fleckenstein: no complaints from CI so that must be up to your specific implementation 19:54 Fleckenstein if you call coroutine.yield() from a function called by some native C code, you get the attempt to yield across C call boundary error 19:55 Fleckenstein e.g. lua code -> table.sort(table, callback) -> callback() -> coroutine.yield() -> error 19:55 Fleckenstein for some reason the same error happens if i use my library inside of minetest + plain lua, LuaJIT however works 19:55 Fleckenstein i haven't quite figured out the problem yet 19:59 sfan5 the flow is lua code -> core.dynamic_add_media(..., callback); coroutine.yield() 20:00 sfan5 then that callback is called from C++ later -> lua panic 20:01 sfan5 it doesn't even matter what kind of function you pass to it: an empty closure, an empty global function, core.show_formspec, ... 20:01 sfan5 it all errors 20:01 sfan5 so I suspect Minetest would have to do something to handle this case with coroutines, but what? 20:04 sfan5 probably this https://www.lua.org/manual/5.1/manual.html#2.9 20:26 sfan5 wait maybe I should tried a debugger earlier, not that the error makes more sense but I can tell where it comes from 20:26 sfan5 should havE* 20:45 sfan5 okay so the bug is "simple": Minetest assumes there is only ever one lua_State, but this trivially violated by coroutines 20:46 MTDiscord the bug might be "simple", but I suppose the fix will be fairly nontrivial... 20:47 sfan5 this only matters for a few functions to begin with but yeah 20:51 sfan5 in fact the situation is so unique I don't think there's more than dynamic_add_media 20:52 sfan5 ...which is ironically the function I picked to test 22:59 MTDiscord sfan, if you're around still, could you clarify whether you want me to keep the shared pointer change or instead re-order the code so the unique ptr can be moved? 23:06 sfan5 you can leave it like this 23:21 MTDiscord Does breaks reordering it break something? Or is it just more work to review? 23:26 sfan5 it breaks something if you're not careful, it works with std::shared_ptr 23:28 MTDiscord Gotcha. Thank you!