Quackster
a devbest user says what
Project Euclid is a Habbo Hotel server written in C# NET 5.0 that uses various libraries such as DotNetty and NHibernate to emulate the version 1 of Habbo Hotel when it was first around in 2001, which at the time of writing is 21 years old.
I must preface by saying, while yes, I did indeed write
You must be registered for see links
, which was the damn near almost complete version 1 server of Habbo Hotel. I wrote this back in 2017, almost five years ago. There are plenty things wrong with the server, which Euclid will correct and it is better to start again than to try and apply duct tape to that codebase.Features
- Fully implemented RC4 encryption (client->server)
- Register
- Login
- Support for multiple public rooms
- Navigator
- Private rooms
- Create rooms (with proper redirect into room, unlike any other V1 server before it)
- Update rooms (with correct room info displayed when editing)
- Walking
Frequently Asked Questions
Open source?
Of course it will be open source, eventually. No one will be interested in this otherwise.
Why a server for version 1 in 2022?
We have the Lingo for the version 1 so why not create it to the best of our abilities.
Why are you using NHibernate?
Why not? I like it.
Code Snippets
Configuration file example (public rooms each require their own port to distinguish which room they connected to)
Code:
<configuration>
<mysql>
<hostname>localhost</hostname>
<username>root</username>
<password>123</password>
<database>euclid</database>
<port>3306</port>
<min_connections>5</min_connections>
<max_connections>10</max_connections>
</mysql>
<server>
<main>
<ip>127.0.0.1</ip>
<port>37120</port>
</main>
<private>
<ip>127.0.0.1</ip>
<port>25006</port>
</private>
<public>
<room>
<ip>127.0.0.1</ip>
<port>22009</port>
<room_id>1</room_id>
</room>
</public>
</server>
</configuration>
BusyFlatResultsComposer
Code:
using Euclid.Game;
using Euclid.Network.Streams.Util;
using Euclid.Storage.Database.Data;
using System.Collections.Generic;
namespace Euclid.Messages.Outgoing
{
class BUSY_FLAT_RESULTS : IMessageComposer
{
private List<Room> rooms;
public BUSY_FLAT_RESULTS(List<Room> rooms)
{
this.rooms = rooms;
}
public override void Write()
{
foreach (var room in rooms)
{
Data.Add(new ValueEntry(room.Data.Id, "/"));
Data.Add(new ValueEntry(room.Data.Name, "/"));
if (room.Data.ShowName)
Data.Add(new ValueEntry(room.Data.OwnerData.Name, "/"));
else
Data.Add(new ValueEntry("-", "/"));
if (room.Data.AccessType == RoomStatus.OPEN)
Data.Add(new ValueEntry("open", "/"));
if (room.Data.AccessType == RoomStatus.CLOSED)
Data.Add(new ValueEntry("closed", "/"));
if (room.Data.AccessType == RoomStatus.PASSWORD)
Data.Add(new ValueEntry("password", "/"));
Data.Add(new ValueEntry("Floor1", "/"));
Data.Add(new ValueEntry("", "/"));
Data.Add(new ValueEntry(room.Address.IpAddress, "/"));
Data.Add(new ValueEntry(room.Address.IpAddress, "/"));
Data.Add(new ValueEntry(room.Address.Port, "/"));
Data.Add(new ValueEntry(room.Data.UsersNow, "/"));
Data.Add(new ValueEntry("null", "/"));
Data.Add(new TextEntry(room.Data.Description));
}
}
}
}
Images
Working room creation
Working pagination on navigator
Last edited: