Welcome!

Join our community of MMO enthusiasts and game developers! By registering, you'll gain access to discussions on the latest developments in MMO server files and collaborate with like-minded individuals. Join us today and unlock the potential of MMO server development!

Join Today!

Plus++ Emulator - Community Continuation of Plus Emulator

Skilled Illusionist
Joined
Jun 16, 2011
Messages
320
Reaction score
86
Shoutout to @Sledmore et al. for PlusEMU which after all this time still remains one of the most prominent emulators around.

Plus++ (pronounced "Plus, Plus Plus" – just like C++) is a public community continuation of Plus Emulator. At the time of writing, we're 412 commits ahead of the base branch and growing! 🌱

Our focus so far has been to refactor the code base and bring it up to modern standards, with the occasional addition of new features and bug fixes.

We know that motivation is key in any project, so we're encouraging everyone to contribute in any way they can. Whether it's through bug reports, feature requests, or code contributions, anything and everything is welcome! 🤗

🔗 Check out the project on GitHub:

Short Summary of Changes:
  • Upgraded the project to .NET 7
  • Added Dapper SQL support
  • Implemented Dependency Injection throughout the emulator
  • Introduced async handling of packets
  • Fixed an issue with badge ordering - refactored it while fixing
  • Fixed several memory leaks present
  • Refactored Room Sessions, Items, Networking
  • Renamed a load of packets to match Habbo's Flash Naming
  • Supports Nitro by default with Multi Revision Support
  • Added a Plugin System
1681574726286 - Plus++ Emulator - Community Continuation of Plus Emulator - RaGEZONE Forums
For a more detailed changelog, you can visit the GitHub repository and browse through the commits to see all the awesome improvements we've made so far:

We're keen to see any contributions possible from PR to bug reports, anything will help.
 

Attachments

You must be registered for see attachments list
Last edited:
Joined
Jun 23, 2010
Messages
2,323
Reaction score
2,195
Good luck!

Might wanna check out your async call chain. Your packet handler is still synchronous, because your GameClient's OnReceive method is being called inside a sync void method in both proxies. This can give strange behaviour and a potential deadlock.

1681684188508 - Plus++ Emulator - Community Continuation of Plus Emulator - RaGEZONE Forums
 

Attachments

You must be registered for see attachments list
Newbie Spellweaver
Joined
Nov 21, 2011
Messages
66
Reaction score
12
(Forgive my English, I'm Spanish).

As an idea I think it's very good, but the code base is a bit of a mess.

I think that the classes are too complex which will end up leading to poorly maintainable code (such as the Environment/Program class), in which, for example, extension methods could be used to register the dependencies. It reminds me a bit of the "Utils" classes that contain all the code put there, independent of each other.

I also see that interfaces are implemented for everything, or almost everything, when it is not always necessary... will you include unit tests?

It would be fine to use sealed classes by default, except those that are open to an extension.

You could take a look at certain uses, instead of using struct, use struct records or only records.

It would be good to divide the server into layers (not physical folders, but projects), and have the references well stored, with their interfaces, and that the layers are necessary to see each other. Even think about including MediatR, which in the future could help to decouple the server into different modules.

Too many hardcoded strings? SQL queries in classes, etc... Could an orm like Dapper or entity framework be implemented?

Do not take it as a bad thing, I would just like to open a debate on these points.

Thank you so much,
All the best!
 
Joined
Aug 10, 2011
Messages
7,398
Reaction score
3,301
(Forgive my English, I'm Spanish).

As an idea I think it's very good, but the code base is a bit of a mess.
Messy, yeah. Outdated? Sure. But the original Plus base is pretty okayish organised and documented and a lot of people around here have at some point played around with Plus, butterfly or anything on the same base.

I think that the classes are too complex which will end up leading to poorly maintainable code (such as the Environment/Program class), in which, for example, extension methods could be used to register the dependencies. It reminds me a bit of the "Utils" classes that contain all the code put there, independent of each other.

You're referring to parts of the original code base that is still due to be refactored. It would've been faster if more people helped out but alas. Environment and Program are one of the least complex classes out there. (They still need to be cleaned up once Dependency Injection has been fully realized throughout). Have you had a look at ?

I also see that interfaces are implemented for everything, or almost everything, when it is not always necessary... will you include unit tests?
Maybe, if someone writes them. But it makes it easy to replace parts of the emulator through plugins as they can just re-implement that specific part of the interface if needed.

It would be fine to use sealed classes by default, except those that are open to an extension.
Personally not really a fan of sealing everything by default. Plus++ is meant to be open for modification through extensions (plugins). Locking things down by default and only opening them up once requested seems unfair to plugin developers.

You could take a look at certain uses, instead of using struct, use struct records or only records.
Yes thats part of the refactoring. We don't want to blanket apply whatever suggestions resharper is throwing at it.

It would be good to divide the server into layers (not physical folders, but projects), and have the references well stored, with their interfaces, and that the layers are necessary to see each other. Even think about including MediatR, which in the future could help to decouple the server into different modules.
We want to keep it simple for new developers to join, a simple code base that doesnt require too much specific library knowledge would make it more attractive to write plugins. Making it modular sure, making it distributable eh, when was the last time you saw a server hit 10k online? Maybe 10 years ago and since then C# / .NET has come a long way with performance optimalisations.

Too many hardcoded strings? SQL queries in classes, etc... Could an orm like Dapper or entity framework be implemented?
If you had a look at the library references you would see Dapper is slowly being introduced:

Again, dapper is more noob friendly and with EF you're still going to have to manually deal with async state changes and its a bit more trickier to debug imo when the majority of actively used data lives in memory.

Do not take it as a bad thing, I would just like to open a debate on these points.

Thank you so much,
All the best!

Sure, feel free to make PRs or join the development boards discussions.
 
Newbie Spellweaver
Joined
Nov 21, 2011
Messages
66
Reaction score
12
Messy, yeah. Outdated? Sure. But the original Plus base is pretty okayish organised and documented and a lot of people around here have at some point played around with Plus, butterfly or anything on the same base.



You're referring to parts of the original code base that is still due to be refactored. It would've been faster if more people helped out but alas. Environment and Program are one of the least complex classes out there. (They still need to be cleaned up once Dependency Injection has been fully realized throughout). Have you had a look at ?


Maybe, if someone writes them. But it makes it easy to replace parts of the emulator through plugins as they can just re-implement that specific part of the interface if needed.


Personally not really a fan of sealing everything by default. Plus++ is meant to be open for modification through extensions (plugins). Locking things down by default and only opening them up once requested seems unfair to plugin developers.


Yes thats part of the refactoring. We don't want to blanket apply whatever suggestions resharper is throwing at it.


We want to keep it simple for new developers to join, a simple code base that doesnt require too much specific library knowledge would make it more attractive to write plugins. Making it modular sure, making it distributable eh, when was the last time you saw a server hit 10k online? Maybe 10 years ago and since then C# / .NET has come a long way with performance optimalisations.


If you had a look at the library references you would see Dapper is slowly being introduced:

Again, dapper is more noob friendly and with EF you're still going to have to manually deal with async state changes and its a bit more trickier to debug imo when the majority of actively used data lives in memory.



Sure, feel free to make PRs or join the development boards discussions.
Hello The General, I have followed your work closely all these years, and it is a pleasure to be able to speak with you.
I agree with you. I started in this scene thanks to open source emulators, and, in fact, today I dedicate myself to software development for those years when I played Habbo, and I wanted to understand why and how this game that I liked so much worked.
But just because it's well documented, or has been played around a lot, doesn't mean it's good code, or readable code, by any means.

Regarding the interfaces, it reminds me a lot of the meme (without taking it the wrong way, I'm kidding):
1682082198637 - Plus++ Emulator - Community Continuation of Plus Emulator - RaGEZONE Forums



Yes, I see and understand the effort of wanting to continue maintaining projects of this style, even like you, who are developing a server from scratch. Years ago I dedicated myself to publishing certain elements that were used as the basis for software that prevails today (such as the SQL Furni generator / text generator), or some Java server base that I published for people to learn, and me too, based on comments from those who were developers at the time. I have thought several times about trying to get back to it, but that flash has died makes me back down.
Correct, as you say, it is open to extension (not to modification) as SOLID principles say, thanks to plugins, which allow adding functionality without having to modify existing classes, hence sealing all classes by default, except those that are known to spread.
I don't use resharper, they are things that I have been able to see with the naked eye, sorry if it bothered you, it was not my intention.
Indeed, you have to take advantage of the fact that C# has come a long way, but not everything is development "to play with", but you have to take advantage and learn everything you can the hard way.
I think that, having a development structure, such as different "Infrastructure" projects with transversal elements, "Dependencies" with the container configurations, Managers.Interfaces, ManagersImplentations, etc... could result in a more understandable project, as you can see you this case?
It would be great to see dapper implemented in the project :)!
As I said, I don't have time to do PR or development, but I am very happy to see that this world, in which I started at the age of 12, is still alive.
 

Attachments

You must be registered for see attachments list
Last edited:
Newbie Spellweaver
Joined
Jan 23, 2023
Messages
12
Reaction score
3
This another dead project? Seems stale everyone wants it to work no one wants to put in work.
 
Newbie Spellweaver
Joined
Mar 19, 2017
Messages
11
Reaction score
5
Struggling to get this running properly. I've got the following error when trying to connect via the latest version of Nitro and Plus++.

Code:
11:36:26.0739|WARN|Plus.Communication.Packets.Incoming.Handshake.ClientHelloEvent|Unknown revision connected NITRO-1-6-6.

Any ideas? I renamed the revisions file to 1.6.6 (nitro build) and no luck.
 
Joined
Aug 10, 2011
Messages
7,398
Reaction score
3,301
Struggling to get this running properly. I've got the following error when trying to connect via the latest version of Nitro and Plus++.

Code:
11:36:26.0739|WARN|Plus.Communication.Packets.Incoming.Handshake.ClientHelloEvent|Unknown revision connected NITRO-1-6-6.

Any ideas? I renamed the revisions file to 1.6.6 (nitro build) and no luck.
Did you rename the file as well as the name within the json file (at the top)?

 
Newbie Spellweaver
Joined
Mar 19, 2017
Messages
11
Reaction score
5
Did you rename the file as well as the name within the json file (at the top)?

Yes, now its sending packets but client stuck at 60%. with no errors in dev console and this is what emulator is saying.

Diddy - Plus++ Emulator - Community Continuation of Plus Emulator - RaGEZONE Forums


Any ideas?
 
Back
Top