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!

NexusServer v2 (C++/Qt)

Initiate Mage
Joined
May 25, 2011
Messages
77
Reaction score
58
Aerospark - NexusServer v2 (C++/Qt) - RaGEZONE Forums

NexusServer v2
Current version: v2.0.0 r169 (SVN only)
A Habbo Hotel server core written in C++ using the Qt Framework.


Supported protocols: (Untested versions followed by a question mark, but are assumed to work)
Shockwave: v8? v9 v10? v11? v12? v13 v14 v15 v16 v17? v18? v19?


Hello everyone, some of you may remember NexusServer, a project Ktae and I worked on in June-ish. Our servers are back up, and I've decided that though this isn't a project I can profit from (or even put into something like my portfolio,) I'd really like to finish it. A Few days ago Ktae wrote a nice socket/thread pooling/queue system, so using it I've decided to restart NexusServer. Most of the old code was hackish/stubs so I'll be starting pretty much from scratch.




Server specific features:
Code:
  - C++ (Qt, multiplatform)
  - Thread pooling system (currently in need of a few fixes)
  - Thread safe packet broadcasting using Qt's Signal/Slot system
  - QSql (Compatible with a wide array of drivers, from SQLite to MySQL to ODBC
  - Optional native unix-like terminal implementation for windows and curses support
          where applicable (incomplete)
  - INI-style configuration
  - language binding support



Currently implemented (but most likely incomplete) features:
Code:
  - encoding (VL64/B64)
  - non-sso login
  - non-sso registration
  - updating figure/motto/etc
  - public room list (stub)
  - private room categories
  - room creation (the client does this improperly)
  - room listing (complete)
  - own room listing (complete)
  - entering rooms
  - room user listing (incomplete)
  - chat
  - temporary warping until pathfinding
  - catalog
  - hand (perfect)
  - furniture (under dev)
  - posters
  - spaces (wallpaper/floor)
  - console missions
  - searching for users in the console
  - friend requests (partial)
  - messages (partial)
  - public rooms (partial, currently only in the navigator)



Changelog:
Code:
Revision 169
-Cleaned up room.cpp

Revision 168
-Fixed public room entering

Revision 167
-repaired the heightmap db

Revision 166
-Continued implementing public rooms

Revision 165
-Fixed db, public room heightmaps

Revision 164
-Fixed a few things in the db, continued work on public rooms heightmap parser

Revision 163
-Continued implementing public rooms

Revision 162
-Added db table publicheights, imported public room heightmap and door location data

Revision 161
-Continued implementing public rooms, added new debugging string to lang file, started adding public room implementations into room.

Revision 160
-Cleaned up the debugging a bit

Revision 159
-Imported some of the public room data

Revision 158
-Implemented the public rooms navigator packet

Revision 157
-Updated public rooms db table, continued implementing public rooms in the navigator

Revision 156
-Started properly implementing public rooms, added DB table publicrooms

Revision 155
-Implemented Opcode::RequestUpdateRoomInfo, Opcode::RequestUpdateRoomName. Currently only descriptions and names are modifiable.

Revision 154
-Started implementing Opcode::RequestUpdateRoomInfo, Opcode::RequestUpdateRoomName

Revision 153
-Implemented Opcode::requestRollDie stub

Revision 152
-Started implementing Opcode::requestSendMessage

Revision 151
-Created table messages for the messenger/console

Revision 150
-Continued work on the friends list

Revision 149
-Fixed friend request DB error

Revision 148
-Continued implementing friends

Revision 147
-Continued implementing friend requests

Revision 146
-Implemented ConfigurationCore::getBool(key) and implemented some db options

Revision 145
-The config, db, and lang file are now loaded from the run directory not the static path they were using before.

Revision 144
-Fixed a few things, implemented Opcode::requestStop stub

Revision 143
-Fixed Opcode::RequestInitializeMessenger to work with console missions.

Revision 142
-Implemented Opcode::RequestSetConsoleMission, added consolemission to the accounts table.

Revision 141
-Cleaned up the startup debugging

Revision 140
-Switched the hardcoded strings in Protocol to with with the new language system

Revision 139
-Started implementing LanguageCore

Revision 138
-Started coding ConfigurationCore.

Revision 137
-Implemented temporary fusestring system, and implemented waving+drinks (though all functions are currently infinite)

Revision 136
-Implemented proper rotation on warp in prep for pathfinding

Revision 135
-Started implementing room modification

Revision 134
-Implemented room searching

Revision 133
-Committed updates since server downtime

Revision 132
-Started implementing friend requests

Revision 131
-Fixed female figures in the console search, users are now properly removed from the list of online clients.

Revision 130
-Cleaned up the opcodes a bit

Revision 129
-The hand is now properly updated when placing paint/flooring and when picking up items.

Revision 128
-Made furniture handling more efficient

Revision 127
-removed bool wallitem parameter from Furniture::Furniture

Revision 126
-Implemented picking up items

Revision 125
-Fixed the "Furniture is loading..." box if there is a poster in the room glitch

Revision 124
-Fixed some issues with the license

Revision 123
-Fixed hotel view disconnect crash

Revision 122
-Fixed room shifting

Revision 121
-Fixed room creation crashes (but it's still not proper)

Revision 120
-Fixed the "under" furniture/walls issue caused by doors

Revision 119
-Proper player locations are now sent when you enter a room, and users will now be placed at the door when they enter the room.

Revision 118
-Made warping pay attention to the heightmap

Revision 117
-Room furniture is now saved to/read from the DB when a room is unloaded/loaded.

Revision 116
-Furniture in a user's hand is now saved when they disconnect, and reloaded when they log in.

Revision 115
-Continued fixing re-ender poster data

Revision 114
-Credits are now updated when purchasing items (but not changed)

Revision 113
-Fixed "r" posters

Revision 112
-Started implementing sending poster info to the client when they re-enter the room

Revision 111
-Fixed the catalog

Revision 110
-Fixed buying posters, implemented posters :'D

Revision 109
-Started implementing purchasing posters

Revision 108
-Clients are now told when a user leaves the room

Revision 107
-Fixed the hand

Revision 106
-Fixed a bug

Revision 105
-Implemented spaces

Revision 104
-Started implementing spaces, changed default floor/wallpaper to match the old retail style

Revision 103
-Started implementing furniture DB saving, and fixed posters in the catalog

Revision 102
-User data is now saved to the DB when a user disconnects.

Revision 101
-Fixed multiplatform compiling

Revision 100
-Implemented furniture stacking
     http://filebeam.com/8fdef8013c1f0d8639c3c46552599b5e.jpg

Revision 99
-Fixed a few things

Revision 98
-Implemented item signatures

Revision 97
-Did some testing

Revision 96
-Implemented furniture movement/rotation

Revision 94-95
-Fixed furniture placement

Revision 93
-Started implementing furniture

Revision 92
-Fixed hand page... leaking...

Revision 91
-Perfected the hand

Revision 90
-Got the hand... kinda... working.

Revision 89
-Made purchasing better

Revision 88
-Implemented Packet::appendTabString, Packet::appendCarriageString, Packet::appendTaggedString, and integrated them into Protocol

Revision 87
-Implemented Room::ownerid

Revision 86
-Started implementing the hand

Revision 85
-Fixed db, implemented Furniture

Revision 84
-Fixed switching rooms, changed furniture table structure

Revision 83
-Cleaned up the output, fixed a few things

Revision 82
-Started implementing Opcode::RequestPurchaseItem

Revision 81
-Fixed navigator bug

Revision 80
-Fixed the navigator packet :'D

Revision 79
-Fixed a couple things

Revision 78
-Implemented FurnitureProfile, FurnitureCore, fixed the "DG" stub

Revision 77
-Fixed the catalog :'D (added a few new stubs)

Revision 76
-Implemented console searching

Revision 75
-More catalog work

Revision 74
-Fixed DB, continued implementing catalog pages

Revision 73
-Implemented Opcode::RequestCatalogPages

Revision 72
-Added catalog data to the DB

Revision 71
-Fixed a couple issues

Revision 70
-Clients are now removed from their current room when they enter a new one

Revision 69
-Updated the license (currently in main and protocol)

Revision 68
-Started implementing FurnitureCore

Revision 67
-Started implementing Opcode::RequestSearchUsers

Revision 66
-Cleaned things up a bit, added 5 more threads to the default task system size

Revision 65
-Created table ProfileOverrides

Revision 64
-Fixed a couple things

Revision 63
-Hackey (but perfect?) club clothing implementation

Revision 62
-Fixed a few things

Revision 61
-Implemented Opcode::InitMessenger

Revision 60
-Renamed sendPacket(!Packet&) -> writeData(!Packet&), sendPacket is now reserved for sendPacket(Packet&)

Revision 59
-Implemented telling other clients when someone enters the room

Revision 58
-Implemented warping

Revision 57
-Added some debugging to try to fix an uncommon issue, added experimental license

Revision 56
-Clients now leave the room when they enter a new one.

Revision 55
-Implemented shout, whisper

Revision 54
-Cleaned up the output

Revision 53
-Implemented Opcode::RequestSay

Revision 52
-Implemented broadcasting packets to all clients in a room (Thanks Ktae)

Revision 51
-Made the hotel view button remove the client from the room

Revision 50
-Implemented room user listing

Revision 49
-Implemented linking clients to rooms

Revision 48
-Implemented more room info (stubs,) this is the result:
     http://filebeam.com/9301b4cc1fc957dd4b0bb1e8c3fd05a3.jpg

Revision 45-47
-Implemented Opcode::RequestHeightmap

Revision 41-44
-Continued implementing room entering



Example of an implemented packet with the packet builder (private room category listing, incomplete but commented):
PHP:
--- at the beginning ---
int showfull = pak.readVL64();
int cat = pak.readVL64();


--- case 4 (private rooms root)? in the switch(cat) statement ---
query.prepare("SELECT id, title FROM roomcategories");
if(query.exec()){
    Packet npak("C\\");
    npak += showfull;
    npak += cat;
    npak += false; //?
    npak += "Guest Rooms";
    npak += 0;// current users
    npak += 0;// max users
    npak += 1;// parent id (should this be cat?)
    //npak += 4;// rooms count
    while (query.next()) {
        npak += query.value(0).toInt();
        npak += 2; //?
        npak += query.value(1).toString();
        npak += 0;//current visitors
        npak += 0;//max visitors
        npak += cat;
        npak += false; //?
    }
    client->sendPacket(npak);
}
break;


--- another packet, full this time ---
case Opcode::RequestEnterRoom:
{
    if(client->isInRoom)client->inRoom->removeClient(client); // remove the client from the current room
    client->inRoom = Room::getRoom(pak.buffer.mid(pak.position,pak.buffer.length() - 5).toInt()); // D: plain text int
    client->inRoom->addClient(client);
    if(client->isInRoom){
        Packet npak("@v");
        npak += false; //?
        npak += false; //?
        npak += client->inRoom->id;
        npak += client->inRoom->ownerstr;
        npak += client->inRoom->model;
        npak += client->inRoom->title;
        npak += client->inRoom->description;
        npak += true; //show owner
        npak += true; //?
        npak += false; //?
        npak += 0; //current users
        npak += 25; //max users
        client->sendPacket(npak);
        npak = Packet("Eb");
        npak += 0;// category, nyi
        client->sendPacket(npak);
    }else{
        //client->writeData("BKRoom not found!\001");
        Packet err("BK");
        err.appendRawLangString("error.room_not_found");
        client->sendPacket(err);
    }
    break;
}

Also, some of the packets require slightly different handling, the packet system also supports methods for those, here is an example of that:
PHP:
case Opcode::RequestUserList:
{
    Packet pae("@\\");

    foreach(Client* pointer, client->inRoom->clients) {
        pae.appendTaggedString('i', QString::number(pointer->userid));
        pae.appendTaggedString('a', QString::number(pointer->userid));
        pae.appendTaggedString('n', pointer->name);
        pae.appendTaggedString('f', pointer->figure);
        //pae.appendTaggedString('l', "5 5 1.0");
        pae.appendRawString("l:");
        pae.appendString(QString::number(pointer->xloc), ' ');
        pae.appendString(QString::number(pointer->yloc), ' ');
        pae.appendCarriageString(QString::number(pointer->zloc, 'f', 3));
        pae.appendTaggedString('c', pointer->motto);
        pae.appendTaggedString('s', pointer->gender);
        pae.appendRawString("\rb:\x0d"); // yellow
    }

    client->sendPacket(pae);

    break;
}

The latest code for the implementations of packets should always be available aswell.



Possible future features/ideas:
Code:
  - Remote control panel (desktop/possibly mobile)
  - Server is set up to easily implement multiprotocol support in the future
  - Javascript module system for easy server expansion



Known issues:
Code:
  - Clients are not deleted quite properly yet, they can sometimes lead to a small (but not continuous) memory leak
         This should be fixed once someone gets the time
  - Poor error handling, sometimes a broken task can crash the server.
  - A few packets are const char* stubs, and need to be updated, they include (server->client header):
      - DU // encryption? thanks lab-hotel
      - DA //date string/session variables?
      - DZ //unknown registration
      - DO //unknown registration
      - CY //unknown registration
      - Dt //?
      - Dp //?
      - Dy //?
      - Dz //?
      - DB //room load advertisement
      - CP //unknown?
      - @^ //unknown room related?
      - @G // subscription information (stub)
  - "Yay! It's being delivered now." message appears when the client sends AXCarryItem or whatever,
         That packet is still unhandled so the client seems to be doing this all on it's own, maybe I need
         to tell it NOT to do that?
  - Some rugs are broken, the produce a PH box, this shouldn't be too hard to fix
  - Sometimes the hand doesn't update when you place an item down so it stays in your hand, 
       it'l go away if you re-open the hand or put it down though, this shouldn't be too hard to fix
       either. (items arent being duplicated, the client just isnt being updated correctly, this has been improved)
  - If the server is spammed with an impossible amount of packets, the task system can break, a fix is currently in the works.
  - The thread pool system is in need of some fixes (not hard ones though), some also pertaining to the above issue.


Here is a recent youtube video demonstrating the functionality of the server: (severely outdated) ( new video coming soon )
And here are the old videos, more will be placed here as they become outdated:


Also I made showing some early stress testing of the server, this is outdated though.

Screenshots:
Aerospark - NexusServer v2 (C++/Qt) - RaGEZONE Forums

Aerospark - NexusServer v2 (C++/Qt) - RaGEZONE Forums

Aerospark - NexusServer v2 (C++/Qt) - RaGEZONE Forums

How to compile:
Supported OS groups (Likely more not listed here):
Windows (2000?/XP/Vista/7/8) (With MSVC++/MingW)
Linux (With GCC)
Mac (With XCode)



Setting up Qt Creator on Windows:
-Download and install the
-Download and install
-Download and install the Qt SDK (online installer, or offline) from .


Setting up Qt Creator on Linux: (Not universal, but you should be able to extrapolate)
-Download and install the package build-essential (GCC) (usually apt-get install build-essential)
-Download and install the following libraries:
-libglib2.0
-libSM
-libxrender
-libfontconfig
-libxext
(For debian and Ubuntu the command to do this is: sudo apt-get install libglib2.0-dev libSM-dev libxrender-dev libfontconfig1-dev libxext-dev)
-Download the Qt SDK from .
-Make the downloaded installer executable (chmod +x filename.bin)
-Run the installer (./filename.bin)


Setting up Qt Creator on Mac:
-Register as a developer on apple's website to download XCode (or find a mirror)
-install XCode (with the GNU C bindings, there should be a checkbox in the installer)
-Download and install the Qt SDK (online installer, or offline) from .


Checking out and compiling NexusServer2:
-Install an SVN Client (apt-get isntall svn on linux, it comes with XCode on Mac, and I'd recommend for windows.)
-Create a new folder for the NexusServer2 source.
-Check out the svn (svn co <url> for Linux and Mac, right click the folder and click "SVN Checkout..." for TortoiseSVN (windows))
-Open the .pro file you just checked out in QtCreator, you should be ready to compile!

Links
Project's SVN: (active development)
SVN Browser/source viewer:
Old server SVN (buggy and depreciated):
Old server root page (compiled downloads, somewhat dysfunctional):
Testing sandbox:


This project is far from complete, I expect it to be updated often.


We're looking for any help we can get on this project, that includes suggestions, so if you think you have something to contribute feel free to PM me or post here.
 
Last edited:
Elite Diviner
Joined
Sep 18, 2009
Messages
414
Reaction score
149
Awesome man! I loved your first version from the start and it was such a bummer that you stopped developing! I'm glad you're back. Simply awesome!
 
Joined
May 23, 2011
Messages
1,607
Reaction score
588
Your first server was awesome, good to see your back ^^
PHP:
static string Encode_VL64(int i){
	string s = "";
	char res[6]; //assign the var res to a a char array - len6
	  int p = 0; 
 int sP = 0;
 int bytes = 1;
 int negativeMask = i >= 0 ? 0 : 4; //? : = if else clause
 i = abs(i);
 res[p++] = (char)(64 +(i & 3));
 for (i >>= 2; i != 0; i >>= 6){
	 bytes++;
	 res[p++] = (char)(64 + (i & 0x3f));
 }
 int null = 0;
 res[sP] = (char)(res[sP] | bytes << 3 | negativeMask);
  string tmp =  string(res);
tmp.erase(2,22);
  return tmp;

}
static string Encode_B64(int i){
string s = "";
 for (int x = 1; x <= 2; x++){
                s += (char)((char)(64 + (i >> 6 * (2 - x) & 0x3f)));
}
 return s;
}
static int Decode_B64(string strVal){

    int intTot = 0;
    int y = 0;
    for (int x = (strVal.length() - 1); x >= 0; x--) {
        int intTmp = (int) (char) ((strVal.at(x) - 64));
        if (y > 0) {
            intTmp = intTmp * pow(64.0,  y);
        }
        intTot += intTmp;
        y++;
    }
    return intTot;
}
static int Decode_VL64(string raw){
	int pos = 0;
	int v = 0;
	bool negative =  (raw[pos] & 4) == 4;
	 int totalBytes = raw[pos] >> 3 & 7;
                v = raw[pos] & 3;
				pos++;
                int shiftAmount = 2;
                for (int b = 1; b < totalBytes; b++)
                {
                    v |= (raw[pos] & 0x3f) << shiftAmount;
                    shiftAmount = 2 + 6 * b;
                    pos++;
                }
 
                if (negative)
                    v *= -1;
 
                return v;
}
I ported the vl64 and b64 stuff that Jeax wrote, if you need it
Good luck with this :D
 
Web & Interaction Design
Member
Joined
Dec 18, 2010
Messages
1,506
Reaction score
712
Our linux cPanel server is called Nexus. xD

Good luck! :thumbup1:
 
Divine Celestial
Member
Joined
Oct 2, 2011
Messages
858
Reaction score
272
Nice, glad to see it's old school :D

Good luck :)
 
Joined
Dec 26, 2006
Messages
1,305
Reaction score
167
Code:
DU //?
@H //usable outfit pieces?
DA //date string?
DZ //unknown registration
DO //unknown registration
CY //unknown registration
Dt //?
Dp //?
Dy //?
Dz //?

@H Useable outfit pieces aye! @H[100,105,etc]
DZ - (register) On the screen when password is filled in, approve the password is disapprove DZbool
DO - (register) aprove email, "DO"
 
Initiate Mage
Joined
May 25, 2011
Messages
77
Reaction score
58
Code:
DU //?
@H //usable outfit pieces?
DA //date string?
DZ //unknown registration
DO //unknown registration
CY //unknown registration
Dt //?
Dp //?
Dy //?
Dz //?

@H Useable outfit pieces aye! @H[100,105,etc]
DZ - (register) On the screen when password is filled in, approve the password is disapprove DZbool
DO - (register) aprove email, "DO"

Thanks :) yeah, the things that are static aren't that important to the function yet. (Except that outfit pieces one, I need to find a proper list of the club vs free outfit configurations.) Apparently sending fuse_use_club_outfits doesn't do anything.

@Caustik, Thanks :eek: but I was able to move the old encoding methods over from the other server and improve them a little, so that's already covered.

Happy new years everyone :)



Edit: The changelog has been updated. I implemented listing your own rooms, and started implementing entering rooms.
 
Last edited:
Initiate Mage
Joined
Dec 27, 2011
Messages
52
Reaction score
45
Your first server was awesome, good to see your back ^^
PHP:
static string Encode_VL64(int i){
	string s = "";
	char res[6]; //assign the var res to a a char array - len6
	  int p = 0; 
 int sP = 0;
 int bytes = 1;
 int negativeMask = i >= 0 ? 0 : 4; //? : = if else clause
 i = abs(i);
 res[p++] = (char)(64 +(i & 3));
 for (i >>= 2; i != 0; i >>= 6){
	 bytes++;
	 res[p++] = (char)(64 + (i & 0x3f));
 }
 int null = 0;
 res[sP] = (char)(res[sP] | bytes << 3 | negativeMask);
  string tmp =  string(res);
tmp.erase(2,22);
  return tmp;

}
static string Encode_B64(int i){
string s = "";
 for (int x = 1; x <= 2; x++){
                s += (char)((char)(64 + (i >> 6 * (2 - x) & 0x3f)));
}
 return s;
}
static int Decode_B64(string strVal){

    int intTot = 0;
    int y = 0;
    for (int x = (strVal.length() - 1); x >= 0; x--) {
        int intTmp = (int) (char) ((strVal.at(x) - 64));
        if (y > 0) {
            intTmp = intTmp * pow(64.0,  y);
        }
        intTot += intTmp;
        y++;
    }
    return intTot;
}
static int Decode_VL64(string raw){
	int pos = 0;
	int v = 0;
	bool negative =  (raw[pos] & 4) == 4;
	 int totalBytes = raw[pos] >> 3 & 7;
                v = raw[pos] & 3;
				pos++;
                int shiftAmount = 2;
                for (int b = 1; b < totalBytes; b++)
                {
                    v |= (raw[pos] & 0x3f) << shiftAmount;
                    shiftAmount = 2 + 6 * b;
                    pos++;
                }
 
                if (negative)
                    v *= -1;
 
                return v;
}
I ported the vl64 and b64 stuff that Jeax wrote, if you need it
Good luck with this :D

Why are you using string's instead of byte arrays, your causing pointless overhead.
 
Joined
Jul 29, 2010
Messages
720
Reaction score
515
Then why don't you go back in time and delete all your old fake development threads on your countless other accounts?

Ontopic;

Looks good. Any hope to support the newer habbo versions?

Ah, okey why don't YOU go back in time and delete all your uberCMS edits and your fake "exploits fixes"?
 
Experienced Elementalist
Joined
Apr 20, 2007
Messages
235
Reaction score
300
I like it. By the way:
- DU is an encryption related packet. On < 26 there are two Boolean values that indicate if the encryption will be used on server > client and the other is for client > server. On v26, the second bool was removed.
- @H // available sets
- DA // session parameters
 
Initiate Mage
Joined
May 25, 2011
Messages
77
Reaction score
58
Then why don't you go back in time and delete all your old fake development threads on your countless other accounts?

Ontopic;

Looks good. Any hope to support the newer habbo versions?
The server is programmed to easily add new protocols in the future, but I plan on getting the shockwave one at least close to fully implemented before starting that. The previous server actually had both protocols functioning with basic rooms and pathfinding and furniture/etc, but right before I was about to release they made that protocol update...


I like it. By the way:
- DU is an encryption related packet. On < 26 there are two Boolean values that indicate if the encryption will be used on server > client and the other is for client > server. On v26, the second bool was removed.
- @H // available sets
- DA // session parameters
Thanks, I didn't know that had to do with encryption :eek:, well I guess it'l stay stay static for now.


Oh also, if nobody noticed I've added a new video to the first post showing additional progress, im working on finishing the room->user handling and once I'm done that I'll probably move on to pathfinding.
 
Last edited:
Initiate Mage
Joined
May 25, 2011
Messages
77
Reaction score
58
Multiuser packet broadcasting has just been implemented (thanks to Ktae) and I've implemented chatting/shouting/whispering. A simple instant warp feature for movement has also been implemented before pathfinding. The pathfinding logic is written, but I want to get it implemented into the server properly using the task system.


Also on a little side note: I did some early stress testing with the new server and it looks promising, I had ~400 clients last night in one room saying random messages and the server was using 9mb ram and ~15% cpu in a single core XP VM (in task manager).
 
Last edited:
Initiate Mage
Joined
May 25, 2011
Messages
77
Reaction score
58
Looks good Aero :D
Are you using any QT wrappers for the socket connections? (C++ sockets are a pain in the butt imo)
Yes actually, we are using QTcpSocket to handle that stuff in if you want to take a look at how. NexusServer2 should be completely multiplatform (that is anything that supports Qt.)

I've also just made an showing some of the early stress testing, and an issue I need to figure out with the task system. The memory usage is slightly higher than before because it's actually handling them correctly now, but nothing substantial.
 
Last edited:
Back
Top