Time Nick Message 03:13 alguien I'm calling minetest.find_nodes_in_area_under_air in a callback to minetest.emerge_area for random coords, and I always get nothing. But when I TP there, there obviously are nodes under air. What gives? 03:21 alguien In fact, even if I call minetest.find_nodes_in_area_under_air for an area next to the player, I still get 0 elements back! 03:41 alguien Is there a group for walkable nodes? 08:16 alguien Just to update anyone who might have been following, I had no luck with find_nodes_in_area_under_air because by default it searches for dirt nodes. Instead I fed it a bunch of groups so it finds whatever 08:16 alguien A bunch of groups because it seems there is no "group:walkable" 08:52 calcul0n alguien, i didn't follow but you could list existing items at startup and define the group yourself 08:53 calcul0n existing nodes in fact 08:53 alguien calcul0n, eh, that doesn't help for my needs 08:53 erle what are your needs? 08:55 alguien erle, identifying nodes one can stand on, but i'm using basic_robot so the code should (ideally) be transient. A custom group would have to be updated every time a new mod is added. Plus even if there were a group "all" it's not the same as "walkable" 08:56 alguien (it's for a random teleporter that I wrote for basic_robots) 08:56 erle you take the task seriously, i admire that 08:56 alguien Thanks 08:57 alguien It's not ideal, right now I'm looking for any of {"group:cracky", "group:crumbly", "group:choppy", "group:water"} under 2 blocks of air at a random location 08:58 alguien But anyway, off to another thing: I don't suppose there's a handy way to access the log via the lua API? 09:01 erle water is not exactly something you can stand on 09:02 erle why would you want to access the log? 09:04 MTDiscord You could create a group:walkable by looping over node defs and adding it to nodes with walkable=true/false. group:all the same but for every node. 09:04 MTDiscord In an on_mods_loaded 09:06 alguien erle, when i pick a place, there's a high chance that the surface is water, so i allow random teleportation to dump you into water 09:08 alguien GoodClover: true 09:09 erle GoodClover does the way this API works look good to you? https://git.minetest.land/erlehmann/tga_encoder/src/commit/1f9c446a98c9082ac1083532f8419966773a8f1e/examples.lua 09:10 erle GoodClover also are you aware of the modlib written by luatic? 09:11 erle GoodClover like i wonder if anyone actually wants to do stuff like … save("fractal_24bpp.tga", {color_format="B8G8R8"}) 09:11 erle maybe luatic can do the same for PNG some time 09:12 erle hmm, i should probably add a switch to control the pixel order, so the heart does not need to be upside down 09:14 alguien erle, i want to find out where the player's bones are after the fact. Would be nicer if I could just remember it, but I can't have any event triggers, it's basic_robots again 09:14 alguien (and bots other than the admin bot don't automatically start, and don't run after a person leaves an area) 09:14 erle (i will not change the default encoding option, after all it needs to be 100% compatible with existing stuff) 09:15 calcul0n alguien, are you working on a mod working with basic_robot or on robot code? 09:15 calcul0n btw they can be started by a machine signal like a keypad or clock gen 09:15 calcul0n if you also have basic_machines 09:15 alguien calcul0n, i'm working on a quote-unquote mod that the basic_robot is going to run. Not planning on changing basic_robot code nor write a new mod. 09:16 alguien calcul0n, really? I didn't know that. I know they can be started with mesecons 09:16 calcul0n ho, didn't know that too :) 09:18 alguien calcul0n, what kind of signal does a basic_machine clock emit? 09:18 alguien I mean I'm not getting a lot of hits: https://github.com/ac-minetest/basic_robot/search?q=basic_machines 09:18 calcul0n the same as keypad in repeat mode, it just never stops 09:19 alguien heh, optional dependencies: what are those? https://github.com/ac-minetest/basic_robot/blob/master/depends.txt 09:19 erle GoodClover https://content.minetest.net/packages/LMD/modlib/ 09:19 alguien calcul0n, no i mean but i thought it only worked with other basic_machines 09:21 calcul0n well machine signals just "activate" stuff, it's a list of predefined actions depending on the node receiving it 09:22 calcul0n for instance they can also turn a furnace on iirc 09:22 alguien calcul0n, just tried it with a clock, works 09:23 alguien (though not when the area unloads, so) 09:23 calcul0n yep, you have to forceload the area for that i guess 09:24 alguien yuck 09:25 alguien but thanks for the explanation of basic_machine clocks 09:25 alguien i guess they do something like the robot's activate.(1) 09:26 alguien intersting mod, too bad the mover UX is bad 09:27 calcul0n let's say it's not very intuitive :) 09:35 alguien punch source 1, you punch a 1 appears. So far so good 09:35 alguien punch source 2. -Ehm. source 2? 09:36 alguien You punch source 1 because there's no source 2. The one disappears. No new message appears 09:36 alguien You punch it again, 1 reappears 09:37 alguien Punch target. 2 appears 09:37 alguien okeh 09:38 alguien It's a bit different, but that illustrates the confusion 09:45 calcul0n yeah, that's because 1/2 marks are entities so you must "kill" the 1 before you punch again 09:47 calcul0n but indeed that's confusing 16:31 alguien calcul0n, the authort could've made it so that if you hit the 1 again it just skips to set destination 16:33 alguien also I'd've made the second message "Hit the source again or hit something else to set an additional source" 16:36 alguien But it's not just about numbers being entities, it's that sources are both marked "1", and the destination always "2", but the initial message is like "Hit source1, then source2, then destination" 16:36 alguien And since there is no difference in colors of the source1's "1" and source2's "1", that's even more confusing 16:46 erle palette encoding, finally! https://git.minetest.land/erlehmann/tga_encoder/src/branch/master/examples.lua#L104 16:49 erle i meant https://git.minetest.land/erlehmann/tga_encoder/src/commit/45e405982a820c3fb81c11b65350ca7cae2a53e4/examples.lua#L104 19:09 erle luatic anything missing or inaccurate here? https://git.minetest.land/erlehmann/tga_encoder/ 19:10 erle the color-mapped encoding is so simple i am surprised i did not do it before 19:10 erle also i have about 150 lines of code that are duplicated in a <500 lines mod, i should clean that up 19:34 MTDiscord erle: Looks nice to me :) 19:35 MTDiscord (The TGA lib) 19:35 MTDiscord Though I prefer handling disk myself, being enforced to do it via a library is never nice. 19:37 MTDiscord local bytes = tga.image(pixels):encode() or something 19:39 MTDiscord oh! turns out :encode is a function! 19:40 MTDiscord (personally I much prefer a stateless lib, without metatable-d "classes", but that's leaning into bikeshedding) 19:40 erle GoodClover i started with a very simple thing made by fleckenstein. this stuff keeps backwards compatibility with it. 19:40 erle GoodClover do you have any wishes? 19:41 erle except puttting it on cdb, i'll submit it when i'm sure there is not an obvious API wart 19:41 MTDiscord If you accidentally guess an API function, then that's a sign of an intuitive interface :-) 19:42 MTDiscord … to end world hunger? ^^ My only thing would be making the :encode()s return the data they produce do I don't have to do a pointless variable dance 19:42 erle i mean except that you can probably shave 150 lines off it because i triplicated the RLE encoder in a copy-paste orgy and better RGBA support in A1R5G5B5 and paletted encoding i don't have any ideas 19:43 erle GoodClover the “pointless variable dance” is reading out the images .data attribute? 19:44 erle i mean saving is basically 19:44 erle local f = assert(io.open(filename, "wb")) 19:44 erle f:write(self.data) 19:44 erle f:close() 19:44 erle end 19:44 erle (ignore the ”end” obv) 19:45 erle GoodClover, is the “pointless variable dance” that the *image* is a variable? 19:45 erle Warr1024 do you see any API warts? 19:45 erle in the examples.lua file 19:49 MTDiscord file:write(tga:from_table(pixels):encode(format_options)) Is more my style of API, but again, this is pointless debate when the API is already existing 19:50 erle it was existing for a long time before i even made it that far 19:50 erle there are like 4 different mods named tga_encoder out there that all have the usage tga_encoder.image(pixels):save(filename) 19:51 erle they only differ in what they write 19:51 erle (raw vs rle, 24bpp vs 16bpp) 19:51 erle so i thought why not unify it 19:51 MTDiscord By avoiding the dance I was meaning add return self.data, so image:encode(); f:write(image.data); could be reduced to f:write(image:encode()); 19:52 MTDiscord oh wait, does it encode when you create from the table? 19:52 erle as i said, the default is image(pixels):save(filename, put_encoding_options_here) … i had not thought of any other use case than my own, which are all file-writing-based 19:52 MTDiscord oh, nope 19:52 erle it used to, but there is a problem 19:53 erle i wanted to retain the same image and encode it in different formats 19:53 erle obviously that means you need to encode on saving and not oncreation 19:53 erle also if you want to edit an image, encoding on saving is obv the more useful thing 19:55 sfan5 so what does tga.image(pixels) do? transform the data in some way? 19:55 MTDiscord Though it does seem to me like this could've just been once function local bytes = tga.encode(pixels, format_options 19:58 erle the constructor only sets pixels, width, height. just in case anyone wants to play with the pixels before encoding. 19:58 erle as i said, i kept it compatible with the previous onces. i would probably have made a single encoding function that is stateless. 19:59 erle if i had designed it. 20:00 erle then again, i might use this to offer a better in-place editing interface. 20:00 erle anyways, i have no ideas what to do with this except maps, fractals and possibly much better signs. 20:01 MTDiscord Personally I like the fluent interface 20:02 MTDiscord I mean ideally anything that's not a getter would return the object and you can then just chain methods, like image(pixels):desaturate():to_palette():save(filename) or something 20:02 erle well it could definitely allow something like “image:scale(2)” or so later 20:03 erle i thought making desaturation and palette separate actions but it does not seem usable 20:03 MTDiscord It depends 20:03 erle well, internally, mcl_maps actually has a palette of nodes when iterating over the surroundings 20:03 MTDiscord desaturate sort of makes sense to convert to an 8-bit since grayscale fits anyway 20:03 MTDiscord unless you allow partial desaturating 20:04 erle well, my desaturation is “save this thing as grayscale”, so obviously it is a bit ham-fisted haha 20:04 erle to_palette() is useless though, for me 20:04 erle because i always want to provide the palette 20:04 erle is there any case where you do not explictly want to give one? 20:04 MTDiscord Yeah, I mean, gimp has a command it calls "desaturate" where it just removes ALL saturation, but it also has ones where you can play around with the amount of saturation, so partial desaturation is sort of "implied"... 20:05 MTDiscord I mean to me to_palette() is like an RGBA-to-indexed operation. Might take options like a palette (or choice of algorithm to generate one) and dithering options. 20:06 erle oh, i see, dithering 20:06 MTDiscord I suppose at that point it might make sense to just expand this thing into a general image manip library and TGA encoding is just one option. 20:06 erle well, i probably won't add any general things that are not directly connected to serialization formats 20:06 MTDiscord image(pixels):scale(2):rotate(180):to_palette({gen = "octree", dither = "patterned"}):format("tga"):save(file) 20:07 erle that looks disgusting 20:07 erle but i see what you mean 20:08 MTDiscord If you really want to stick with a very narrow scope of just turning a palette and array of pixels into a targa file, then olive's suggestion starts to make more sense. Fluent interfaces make more sense when you have enough operations ... it might make more sense to just have a function that takes the pixel inputs and spits out the encoded file content. 20:08 erle i will revisit this mod when i finally get to the map scaling and updating 20:08 erle so i guess then i will need a scale 20:08 erle and an overlay thing 20:09 erle in fact, i will need to scale textures *down* 20:09 erle because the map is always 128×128 pixels 20:09 MTDiscord If you want to support full image operations but keep scope under control, splitting this into 2 libs might make sense, i.e. one abstract image handling library that wraps some pixels in an "image" object and then just lets you turn one image into another ... and a separate tga encoder that just turns pixels into targa. 20:10 erle well i just made the latter 20:10 MTDiscord downscaling is a bit trickier, since you have to interpolate then... 20:10 erle downscaling for paletted images in particular 20:10 erle with a given palette 20:10 MTDiscord Yeah, I guess I'm saying that rather than scope-creep your tga lib to do scaling and such, maybe it's time to spin off a separate project. 20:11 MTDiscord downscaling with a palette and interpolation sounds like it could be tricky :-) 20:11 MTDiscord Not necessarily terribly so, but tricky enough 20:13 erle my goal is to have maps not use B5G5R5 (as in mineclone2) or A1R5G5B5 (as in mineclonia) but colormapped bitmaps 20:14 erle because that makes editing as simple as updating a single byte 20:15 erle and also it makes it easier to actually create the thing 20:15 erle but yes, downscaling will be … weird 20:15 erle maybe i'll just stay with A1R5G5B5, no idea. 20:16 erle GloodClover Warr1024 given that you have given me the most feedback so far, what should i address before i submit it to contentdb? 20:19 MTDiscord I'd say if it works then it's probably worth submitting, and you can always continue to improve the thing after it's released. There's even a "maintenance state" field you can use to indicate how confident you are that you won't be making breaking changes to the API, i.e. you can still make breaking changes while managing expectations. 20:19 MTDiscord Getting something published there is actually often a pretty good way to get it the kind of exposure that draws more useful feedback. 20:20 erle i try to *never* make incompatible changes to public APIs 20:21 erle i just think, maybe i am not seeing something here 20:22 erle oh btw, treasure maps. that is one more thing. 20:22 erle treasure maps will be great :) 20:29 erle GoodClover btw, what use cases are there to want to save yourself? using minetest.safe_file_write() or how it is called ig? 20:31 erle GoodClover i will edit my review after having tried your mod again, if i can do that. thank you for improving it! 20:47 erle “Please make sure that this package has the right to the names tga_encoder.” – given that it's a drop-in replacement for code i have been improving as part of mineclone2, i'm … pretty sure. 20:55 erle ok, i submitted it! https://content.minetest.net/packages/erlehmann/tga_encoder/ 21:00 MTDiscord Heh, nice, proactively addressed the inevitable issue :-) 21:06 erle Warr1024 well, unfortunately there is something worse to come in the future. after fleck and me had done a lot of work on mcl_maps, kay27 at some point changed it in several incompatible ways, against the advice of literally everyone with knowledge about maps. so mineclone2 and mineclonia mcl_maps now work differently from mineclone5 mcl_maps. i guess i will have the discussion about the name some time later then. 21:07 MTDiscord I don't think the CDB team has figured out what we should do in cases like those either, tbh. 21:07 erle well, basically everything in mcl5 accumulates incompatible changes over time 21:07 MTDiscord i.e. where multiple things all had claim to a name in good faith, and then over time they simply drifted apart... 21:08 erle it relates to the desire to stuff new features in existing mods 21:08 erle to ”reduce dependency problems” haha 21:08 MTDiscord I mean packages are allowed to have incompatible changes with themselves over time, i.e. a package is not required to rename itself simply because they changed certain things... 21:09 erle yeah, but in this case it's literally, like mcl5 maps before a specific date were compatible, after a specific date were not, because kay had … different opinions on how maps should work. 21:09 MTDiscord The idea was just to discourage everyone for making their own default and throwing dependencies into chaos, but without policing change control across the entire community (which I'm not willing to do and I think few if any others are) there will still be loopholes. 21:10 erle the thing is, the mod has to be called mcl_maps so that i can make one that is largely compatible and can be a drop-in replacement 21:10 MTDiscord Games, at least have generally gotten a bit of a pass because if they throw a whole mod ecosystem into chaos, it's generally only their own, so they sort of internalize the consequences. Also because like 80% of the games out there are just more MTG soups... 21:10 erle i.e. my goal is to unfuck mcl5 21:11 MTDiscord Unfortunately if mcl5's goal is to be ununfuckable, according to the definition of fuckedness you're using, then that's gonna be hard. 21:11 erle well, mcl5 is incompatible to its own earlier versions often enough, so i hope people see that it is very different from mcl2 or mcla if it escalates 21:11 erle it's the ”move fast and break things” style 21:12 erle whereas almost all other games gradually upgrade and do not break compat willy-nilly 21:12 erle i can't really aim for compatibility with mcl5 beyond “probably works, unless it has changed in incompatible ways again” 21:15 erle i think the best thing was how i saw AFCMS do it with mcl_tmp_message or how it was called 21:15 erle AFCMS just made a new mod that had a similar purpose, new name, everything goes 21:15 erle and then updated all the callers to the new mod i think 21:16 erle that way you get zero compatibility problems 21:17 MTDiscord Well, you're a fork of mcl2, not of mcl5, right? You can take responsibility for compat with upstream, but not with every "cousin" repo, right? 21:18 erle i will argue that, obviously 21:18 erle on the other hand, someone might argue that kay27 managed to be the first on cdb (with the compatible version of mcl_maps, he changed it much later) 21:19 erle i hope the argument “i managed to submit code to cdb first and then changed it even though the original authors were against it, so i have the right to the name” does not work obv, because that's not a good general rule at all. 21:20 MTDiscord No, it's not just first on CDB; forum posts made before CDB was a thing (at least) also count. 21:20 erle how about git history 21:20 erle or bug trackers 21:21 erle fleck made mcl_maps, the only issue why he was not the first on cdb is because mcl2 for a long time had no release 21:21 erle so people were using git HEAD to play 21:21 erle (it's better now) 21:21 rubenwardy in that situation, I'd argue that mcl2 owns mcl_maps 21:21 erle good 21:22 erle then i can stop caring about what mcl5 does entirely i guess 21:23 MTDiscord The reason for the "right to a name" policy is to enforce at least SOME kind of stability over "public interfaces", e.g. APIs, equivalent game functionality, etc. 21:23 MTDiscord that basically means that you claim a name when you "publicize" it. 21:23 MTDiscord Git commit history is evidence that something was written, NOT that it was published/publicized. 21:23 erle well “move fast and break things” is a belief in that API stability considerations are holding you back. 21:24 MTDiscord Arguably just dropping something out on GH is also not really making it "public" in the sense of the broarder community. 21:24 rubenwardy this isn't something I'd considered when writing the policies. In this case, it's not that someone has independently come up with the mod name, they've forked it and pushed it to CDB first 21:24 MTDiscord "move fast and break things" isn't about breaking API compatibility, it's just about not letting API compatibility hold you back as much. 21:25 erle look, when kay did the incompatible changes he knew about the arguments, knew the other code, i have even contributed to mcl5 myself to fix mcl_maps issues there. 21:25 MTDiscord Our stance on the RTAN policy has evolved over time. 21:25 erle RTAN? 21:25 rubenwardy If Mcl2 made a mod called "fishing", took ages to releases, and then a third-party developer make an independent fishing mod - then the independent modder would have the rights 21:25 MTDiscord Right To A Name 21:25 erle rubenwardy it would of course be mcl_fishing 21:25 erle yeah, my problem is not with unreleased stuff 21:26 erle unreleased stuff can be renamed easily 21:26 rubenwardy yeah, using game namespaces like that helps - and also preempts these issues a lot 21:26 erle but if something is out there, people rely on it working 21:26 MTDiscord Lately we're trying to strongly encourage authors of games to use unique namespaces for their games unless they're more or less direct copies of an existing thing. 21:26 erle yeah, but this still does not really work well for the mcl5 case 21:27 MTDiscord So really what kay should have done, ideally, is as soon as they decided to make changes that would break compat, just rename the affected mod(s). to like mcl5_whatever. 21:27 erle i mean it's not malice or so, it's just the belief that compatibility with upstream is unimportant 21:27 MTDiscord If you don't think that compat is important, then renaming a mod is no problem for you :-) 21:27 erle Warr1024 i think so too. would be the cleanest way. 21:28 erle yeah, the problem is of course that “this is not important” in practice means “i'll do the minimum of work i need to do” 21:28 erle that's always the case in software 21:28 erle in my experience 21:29 MTDiscord To me, "move fast and break things" doesn't mean you just allow compatibility bugs to pile up, it means you tend toward addressing those bugs by declaring flag days more often than you address them by introducing compat code... 21:30 erle yeah and to others it means “this API is ugly, i'll change it and change all the callers in my repo, screw everyone else” 21:31 erle or even “unknown nodes or items can happen when updating this game/mod” 21:32 MTDiscord I actually followed a "move fast and break things" philosophy through the early days of NodeCore, but most of the changes have been "internal" APIs (it has no official external API), and things like recipe or process changes, but even today I can still load ancient map backups from the early closed beta server and run them, and they still load and, as far as I can tell, mostly still work the same. 21:33 MTDiscord Unknown nodes are so easy to solve, though ... just aliases. 21:33 erle hahahaha 21:33 MTDiscord The easy way to avoid ugly API issues is to shoot for a medium amount of ugliness across everything, so that no single part of it sticks out. 21:33 erle i think you are misunderestimating the stupidity that some people come up with 21:34 erle for example, i recently saw something where an existing name did not really fit the item 21:34 erle i'll keep it vague to protect the guilty 21:34 erle so you have item A with an itemstring that would be better suited for the newly introduced item B (according to someone™) 21:34 erle obviously if you change that, all the users' A items turn into B items 21:35 erle and no amount of aliasing can fix it 21:35 erle my response to that is of course: do not do this, the name is used once, then it is burned. 21:36 erle but if someone thinks it is very important that the itemstring is a meaningful string that must refer to something else instead, they will not be satisfied with that advice. 21:37 erle in general, i have learned that in situations where doing nothing is a proper alternative to something stupid, people really dislike the ”do nothing instead” advice. 21:39 erle (as it was in this case) 21:40 MTDiscord Oh, right, yeah, discontinuing use of a name does NOT free it up to be used by something else 21:40 MTDiscord unless you've got some crazy trick you can pull :-) 21:40 erle the person in question had a bunch of ideas 21:41 MTDiscord As a general rule, if you want to rename B to A and then C to B, then the second rename should fail because the alias you created during the first step blocks it :-D 21:41 erle watching the inventory, converting the items, adding meta to the items 21:41 erle introducing crafting recipes so that A can become B and B can become A 21:41 MTDiscord The ugliness of that kind of hack has GOT to be worse than the ugliness of a not-so-logical internal name. 21:42 erle obviously 21:42 erle but some people just can't do architecture 21:42 MTDiscord Well, I did run into a situation where I had 1 node def I needed to change into 2. 21:42 erle they see one wart in the code and then nuke everything to get rid of it 21:42 MTDiscord NC has tree trunks that cannot be rotated and are falling_node, and logs that can be rotated and are not falling. It used to have only tree trunks. I had to replace all trunks in inventories with logs. 21:43 erle well 21:43 erle that doesn't sound stupid 21:43 erle a “stupid” thing for me is an architectural choice that is very hard to recover from 21:44 erle like the ”put everything in one mod” idea 21:44 erle oh, btw, what's also interesting: there are mods on cdb that were pulled into mcl2 and mcl5 21:44 erle or other games, for that matter 21:45 erle like, i wonder if there ever comes a point at which there is a conflict bc of that 21:45 erle the stupidest thing is the mesecons redstone :/ 21:45 erle but we are kinda stuck with it 21:49 MTDiscord If you pull a mod into a game, and either keep the name and compat, or keep neither, then it should all work out (barring, of course, engine problems involving multiple copies of a mod being installed due to e.g. modpacks ... I can't remember if they've worked those out yet ?) 21:50 MTDiscord Putting everything into one mod is not necessarily a stupid idea either, as long as you have some kind of plan for breaking it out if things end up expanding more than you thought. 21:52 MTDiscord NodeCore used to have a HUGE nc_api mod, and then it got broken out into an nc_api base mod, a bunch of ncapi* stuff, and then an nc_api_all that acts like a metapackage for depending on all the ncapi* mods under it, reestablishing the "big ball of mud" interface that the old nc_api monolith offered. There was no graceful way to do this, but I was in touch with the authors of pretty much all mods for the game (more than half were me) 21:52 MTDiscord and so it wasn't so bad to just manage the flag day by hand. 21:54 MTDiscord Sometimes you just couldn't anticipate a need well enough in advance. I prefer to design in a lot of adaptability rather than focusing too hard on anticipating and preparing for specific challenges. 22:28 erle Warr1024 the thing i find stupid is stuff like mcl5 putting the respawn anchor into mcl_beds (because there is a convenient respawn function there) 22:28 erle which obviously means you can not *ever* depend on the respawn anchor (because for many years mcl_beds did not have it) 22:28 erle or putting crying obsidian into mcl_core 22:29 erle i have a solution for that, but it's ugly: make a “shim” mod for such cases that checks if the node or item or function exists, and provides it itself if it does not. 22:30 erle but really, this should not be necessary (and i think many people do either not understand or not care about the dependency issues) 22:32 erle Warr1024 “flag days” are possible if you control everything. it is not possible if people meaningfully interface with your stuff and you can't get hold of everyone. 22:32 erle in any way, i prefer having compatibility shims forever 22:33 erle and if they aren't good enough to keep around forever, they aren't good enough to be used in the first place 22:33 erle (i.e. they are too complex for the problem they solve) 22:36 MTDiscord The respawn code being in the bed mod in the first place, instead of being in a separate utilities and APIs mod, seems like a problem that should have been refactored... 22:39 erle Warr1024 you are, again, thinking about the problem from a POV of a person who does software architecture. if you think from the POV of a person who wants THIS FEATURE RIGHT NOW, it all makes sense. 22:40 erle maybe i should play nodecore one day 22:57 MisterE[m] erle: https://m.youtube.com/watch?v=10DQeSk1LaY 23:01 erle MisterE[m] thanks for increasing the hand range so fast. btw, why did you clear the arena in this weird way? is bulk_set_node not good enough or so? 23:02 erle MisterE[m] also it was a fun game, except for the fun-haters who start to build letters. is there a way to vote them out or so? 23:03 erle i was especially impressed when Li0n managed to guess “candle” from someone building up a tower of white wool blocks and then slowly removing them one by one 23:03 MisterE[m] I used set_node 2 commits ago. But that was causing massive lag on a weaker server 23:03 MisterE[m] Yeah, a vote-out system would be good 23:03 erle like those kind of people ruin the entire game 23:04 erle what i have been successful with is the rule “30% of the people in the group, but at least 3” to be enough to kick someone out 23:04 erle (of a groupchat, mostly) 23:04 erle like if you manage to piss off 3 people in such a small game, it does not matter what you did, you need to go 23:05 MisterE[m] I think 50% may be better 23:05 MisterE[m] But at least 3 23:05 erle doesn't work from my experience to actually require half or a majority 23:05 erle i copied the idea of the qualified minority from ”natural selection” 23:05 MisterE[m] I don't want poeple being mean with it... 23:06 erle hahaha this reminds me when Li0n and me and someone else played on a server with votekick (in another game) and kept it to ourselves, by votekicking every new arrival 23:06 erle until the admin came and we got banned hehe 23:06 MisterE[m] This is why 23:07 erle yeah, but the thing is 23:07 erle this is rare 23:07 MisterE[m] * this is why we can't have nice things XD 23:07 erle btw, did you test if bulk_set_node() was slow too? i mean, set_node() individually is, i know that. 23:07 erle and if it is slow, do you have any on_construct or on_destruct that is relevant? 23:08 erle or is it just naturally slow? 23:08 erle i mean the volume is not even that big 23:08 erle like i don't get why it *has* to be slow 23:09 MisterE[m] No, I unfortunately don't have a lot of time to split among my plethora of projects. So I do a 'if it works, don't fix it' approach often 23:10 MisterE[m] I was useing setnode over the entire inner area 23:10 MisterE[m] That caused massive lag on aes (but not on MG) 23:11 MisterE[m] So when I moved, I was forced to come up with something else. 23:12 MisterE[m] I had used tracking what nodes are changed and repairing them for gems, after placing a huge schem froze MG 23:13 MisterE[m] So I knew that that approch worked 23:13 MisterE[m] And bc ppl were playing and lagging aes, that was quickest to implement 23:14 MisterE[m] Hey erle, if you are interested, I would entertain PRs for improving the minigames 23:15 MisterE[m] Since you seem to be interested enough to read the code :) 23:16 MisterE[m] just for quikbild, sumo, gems, balloonbop, and wormball, those are the oly ones I have control of 23:16 erle so far i only play kwikbild 23:18 MisterE[m] My next focus for improvement is gems tho, I think. Its currently the worst of the bunch 23:18 MisterE[m] Some people like it, but there are serious problems, 23:18 MisterE[m] .