After doing more play-testing of OP 1.3, I have been trying to figure out what else would make sense within the 1.4 scope.
There are some client-side things I want to improve, like the management interface for worlds and servers or some improvements to soften lighting, but I also want to expand the "logic wire" part of the system to have more useful blocks for that.
However, as a result of play-testing, it really got me thinking that there are 2 places where things need to improve: (1) rebalance farming and require soil to be tilled and (2) fix the movement so it allows more options (like running) and doesn't feel so janky.
Now, the open question is whether that requires rewriting that logic (yet again) or if I should just add some missing logic to what I already have. Sure, I could just make "falling" into a mutation so that the client and server would be in sync (since falling without moving feels very glitchy, currently) and add a flag to acceleration to state whether it was walking or running speed without changing everything. However, I really dislike the current design and really wish I had a better idea. Plus, it would probably work poorly under heavy server load or poor network latency
The problem is that it isn't clear who "owns" movement. If it is the client, that is easy but makes detecting invalid moves or preempted actions somewhat tricky, not to mentioning making some kinds of cheating unavoidable (like a cartoon, you can float in the air as long as you don't look down, allowing your friend time to put something under you - the only counter to this is a timeout threshold). It also makes applying things like knock-back from weapons or explosions a bit finicky (those aren't currently in the game). If it is the server, the client performance is basically unusable. If it is a mix, then the system is just very complicated and inflexible. The current approach is a mix but previous approaches had been client-owned.
I feel like I am thinking in circles when I realize client-side ownership of position is insufficient to validate motion so velocity would need to be communicated, only to realize that this is also insufficient and I also need acceleration. Then, after thinking through all of this, I start to think that everything other than position is redundant. Uggh, this is another situation where working alone sucks.
I am worried that another rewrite will somehow just make things worse, allowing more lava flows to accumulate, but I also really dislike the current design and keep thinking that moving the logic purely to the client, leaving only validation on the server, would be far more elegant and flexible. In my more ambitious thoughts, I also start to re-think the way mutations even account for time, instead deciding that they should all consume precisely one tick and leave it up to the client to pack them properly. This would remove a lot of irritating code from the server, simplifying the hell out of client scheduling logic (making it effectively a no-op), and removing the disconnect between continuous and discrete time, on the server, by moving it to the client where those decisions are easier to make. It does also mean that sub-tick actions would become impossible (not sure if someone can meaningfully do 2 things within a 50 ms window, though).
But then I start to wonder if that would break anything else (after all, isn't that important?). Of course, it might also make the idea of overlapping actions (eating while walking) feasible whereas fitting them into the current design would be... interesting.
I think I need to figure out a way to test-bed these ideas, in an isolated simulator, just so I could "play at" solving these core problems without re-writing one of the bigger parts of the system just to realize it was a bad idea.
The logic layer change, despite also having a few complexities, is comparatively easy.
I need to find some way to experiment since thought experiments, alone, are running me in circles,
Jeff.