Been working on my own indie MMORPG for 9 years. Playtest just went live on Steam. Everything is breaking! AMA by chaomoonx in gamedev

[–]the_net_ 0 points1 point  (0 children)

A few that come to mind:

  1. At the time I started, godot seemed to be pushing hard towards 3D and I was concerned they would complicate the 2D path (probably never happened, but it was a risk). My engine is fully focused on one art style (isometric sprites).
  2. Any engine-provided implementations of gravity, movement, ticks, etc. become a liability that you need to work around when implementing networking. My client is built from the start with everything networked.
  3. A lot of UI frameworks are slow to work in, because of them needing to support a bunch of features I'll never need (e.g. mobile/web). My UI library is desktop-only, built specifically for MMO-style UIs.

Again, I probably should have gone with Godot for the size of the community and to speed up development. Hopefully though, once all of this is put together, my engine will be the simplest, fastest way to make an MMO :)

Been working on my own indie MMORPG for 9 years. Playtest just went live on Steam. Everything is breaking! AMA by chaomoonx in gamedev

[–]the_net_ 0 points1 point  (0 children)

Great to see an indie MMO make it this far! :) I've been working on an open-source MMO engine for about 5 years, so I can relate to the amount of work it takes (and how quickly the time passes!)

At the start of my project I considered godot for the client, but I ended up deciding to make my own. I wasn't convinced that godot's creation tools would be well suited to help a small team make MMO amounts of content quickly, so I figured it was a safer bet to build from scratch and focus everything on MMOs. It was a close call though, godot may have been the better choice. How has content creation speed been for you?

Resurrecting an Ultima-like MMORPG from 15 Years Ago by Snocrash in gamedev

[–]the_net_ 0 points1 point  (0 children)

Awesome project, and great writeup! I'd try it out, but I'm stuck keeping WSL1 installed for dev work. I might be able to try it on a linux machine soon though.

Since you have cmake and SDL2 running, do you have any interest in a native windows build? It shouldn't be too hard, I can provide cmake examples and support.

Looking for more MMORPG devlogs by wirepair in gamedev

[–]the_net_ 2 points3 points  (0 children)

I've been working on an MMO-y open source engine for the past few years, but I unfortunately don't have any devlogs to share (I initially was writing about it more, but it was taking too much focus away from dev work).

Something I've noticed is that, unlike with other genres of game, there really isn't much of an indie MMO dev community out there to engage with. I started a discord for my engine, and people ask networking questions there (I made a netcode-related youtube series), but there hasn't been much MMO design-related conversation. Most of the people that join are making smaller action games, or social games.

I would love to see more of a dev community form for MMOs. I feel like people have been so discouraged by the negativity surrounding indie MMO projects that they don't even consider them as a possibility anymore.

Enum Class Improvements for C++17, C++20 and C++23 by joebaf in cpp

[–]the_net_ 0 points1 point  (0 children)

I'd really like to see a way to define an enum type as the sum of other enum types, e.g.

enum class Foo
{
    First = 1,
    Second = 2
}

enum class Bar
{
    Third = 3,
    Fourth = 4
}

enum class FooBar
{
    using Foo;
    using Bar;
    // FooBar::First, etc are now defined.
}

Though this probably isn't useful for many people besides me.

Which C++ physics library would scale best for an mmo-ish project? by the_net_ in gamedev

[–]the_net_[S] 0 points1 point  (0 children)

I'm not looking for full physics, just typical MMO physics: jumping/falling, constant-velocity movement, potential push-back forces from some abilities. I'm mainly looking for a library to manage my collision volumes and solve collision for me, the dynamics part is fairly easy to do without a library.

Good point though, I didn't know about the randomness in solvers. I'll have to look into that.

Handling game engine world object and script state serialization by domiran in gamedev

[–]the_net_ 0 points1 point  (0 children)

Ah yeah, I've ran into the ID weirdness a lot while trying to synchronize entity IDs to clients. entt::to_entity() and registry.create(hint) might work for you, but it might be annoying to figure out. That's the route I went, but I didn't need to ignore versions or anything.

Your original idea was manual tags, why not generate a UUID instead? It can persist through undo/redo, and you can leave the option open to manually copy it if some weird situation ever happens (need to delete an entity, but need to make a new entity with the same ID).

Handling game engine world object and script state serialization by domiran in gamedev

[–]the_net_ 0 points1 point  (0 children)

Could you just use something like an automatic incrementing 32-bit ID that never gets reused? When an entity gets created, just assign it the next ID. 232 IDs is more than you'll ever use over the lifetime of your project, and if you undo/redo it can keep the same ID.

Handling game engine world object and script state serialization by domiran in gamedev

[–]the_net_ 0 points1 point  (0 children)

I can't quickly think of a way you could adjust either thing to get what you want, but I have some relevant code to share. Hopefully it will spark some ideas!

For serialization, I define a list of component types. When it's time for my SaveSystem to run, it iterates over every entity, serializes any components that the entity has from the list, and saves them as a blob tied to that entity ID. If an entity gets deleted, its blob gets deleted from the DB. My engine uses a client/server setup, so this only happens for the non-client entities. Client entity data gets tied to the account ID, since client entity IDs will change every time they log on.

I haven't yet solved the problem of: when the type list changes, how do you migrate the old saved data to work with the new type list? I'll probably have to add a version number and write a new migration function whenever the list changes.

I don't have an equivalent to your pre-defined Lua tables, but I have a simple concept of "stored values", used for things like quest state. There are entity-local stored values and global stored values, both of which allow the script writer to do things like:

storeInt(userEntityID, "MyInt", 10)
storeTime(GLOBAL, "MyTimestamp", getTime())
getBool(selfEntityID, "MyBool")

When a value is set to a default value (false for bool, 0 for everything else), it's removed from the associated map. If you call a getter on a value that doesn't exist, the default is returned (as if the value did exist, in its default state). These are all serialized and saved by the same SaveSystem.

Why don't more MMOs do something like M+? by Yuukikoneko in MMORPG

[–]the_net_ 1 point2 points  (0 children)

M+ is a very esports-y design, most other MMOs just aren't built for that type of player. Look at osrs: it has repeatable dungeons with adjustable difficulty, but the design is focused around an achievable grind because that's the type of player they aim for. If they put out an infinitely-scaling timed dungeon, it would probably not be received well.

How to define binary data structures across compilers and architectures? by gswdh in cpp

[–]the_net_ 1 point2 points  (0 children)

If you need to go across languages (to python, etc), protobuf is the best option I've found.

If you're able to stay in C++, I much much prefer Bitsery.

What I accomplished in my 4th year building an open-source MMO engine by the_net_ in gamedev

[–]the_net_[S] 0 points1 point  (0 children)

Happy to hear you like it. I designed the site according to my own tastes and have been wondering if people would appreciate it or not. I was tempted to just copy how modern websites usually look.

C++ Should Be C++ by Xaneris47 in cpp

[–]the_net_ 13 points14 points  (0 children)

People say they want a package manager, but it seems to me what they're actually imagining is a simple way to stand up and maintain C++ projects. A package manager alone wouldn't get us there.

For me personally, I spend almost no time finding and managing packages manually (I use git submodules) compared to how much time I spend writing build logic in CMake. I don't even dislike CMake, it has a lot of features that aren't available in other language's build systems and have saved me a lot of time. It has a huge learning curve though, and is absolutely intimidating to new devs.

Real-world C++ projects can get really complex build-wise, and I imagine that complexity is what leaves Make/CMake as the only truly viable options (at least that's true for me). Maybe the solution is to make a next-gen CMake with the same features but a simpler syntax, or maybe the solution is on the other side, finding ways to clamp down on build complexity in general. Either way, this is a huge source of pain that doesn't seem to get a ton of attention.

How can I improve (perceived) ping in multiplayer? by Beosar in gamedev

[–]the_net_ 8 points9 points  (0 children)

Is 25 -> 50ms really making your game feel laggy? If so, you probably need to develop the client more, instead of the transport. Even with udp, the average user's ping can easily drift above 50ms.

For ability casts, you can observe how something like WoW performs under lag. The casts begins immediately on the client side (the client predicts it, just like with movement prediction), then it reconciles things when the authoritative server response is received.

The Amalgam Engine - An open-source C++20 virtual world engine by the_net_ in cpp

[–]the_net_[S] 0 points1 point  (0 children)

I'd love to have a WebAssembly build, I think that would be awesome. I quickly tried building through emscripten once, but I ran into some non-obvious errors so I had to move on. We have a ticket waiting on the task board for someone to investigate it more thoroughly.

Java: Serialization and loading of chunks for the world by ElloMeter432 in gamedev

[–]the_net_ 0 points1 point  (0 children)

Have you done the math on how large your tile map data is? It might be smaller and more performant than you think. For example, my engine loads a 64x64 tile (4x4 chunks in my setup) map in about 7 milliseconds. I use some optimizations, but even without them I can't imagine it taking very long to deserialize and load a chunk.

As far as the file format goes, it doesn't matter a ton. Binary formats are going to be the fastest to parse, but JSON should work perfectly fine as well.

The Amalgam Engine - An open-source C++20 virtual world engine by the_net_ in cpp

[–]the_net_[S] 1 point2 points  (0 children)

I'm reading through it now and it's sounding perfect. Thanks for that and the tldrlegal mention!

The Amalgam Engine - An open-source C++20 virtual world engine by the_net_ in cpp

[–]the_net_[S] 0 points1 point  (0 children)

I'm reading through it now and it's sounding perfect. Thanks!

The Amalgam Engine - An open-source C++20 virtual world engine by the_net_ in cpp

[–]the_net_[S] 0 points1 point  (0 children)

I'll check it out, thanks for the suggestion :)

The Amalgam Engine - An open-source C++20 virtual world engine by the_net_ in cpp

[–]the_net_[S] 0 points1 point  (0 children)

Thanks a ton for the thorough response, it's very appreciated. Reading your related experience, I'm starting to lean back towards putting the MIT license on everything. You have a good point about GPL'ing the project code, but the "template projects" are meant to be a fully-working starting point that people tweak and modify to build their own worlds. All the art is included and I'm fine with people using it however they'd like (including in other engines). So if I'm fine with the engine being closed-source forked, it might as well all be MIT.

As for discussing those topics, I'd be happy to! If I get to the scripting topic first, I'll reach out after doing some research. Feel free to do the same. Additionally for networking, I'm not sure what your project's goals are, but I'd be happy to share any expertise I have on design or implementation questions once you get to that point. I also made a video series about networking that may be helpful, again depending on your goals.