- Joined
- Aug 10, 2011
- Messages
- 7,399
- Reaction score
- 3,308
Just dont spend too much time on it. It may eventually go away.
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! public static void BuildSessionFactory()
{
var configuration = Fluently.Configure()
.Database(MySQLConfiguration.Standard.ConnectionString((sb) =>
{
sb.Server("127.0.0.1").Username("root").Password("").Database("tornaado_db");
}).Raw("hbm2ddl.keywords", "none"))
.Mappings(m => m.FluentMappings.Add<MemberMap>());
_sessionFactory = configuration.BuildSessionFactory();
// following code is used to create all tables for example using the classmaps
var exporter = new SchemaExport(configuration.BuildConfiguration());
exporter.Execute(true, true, false);
}
using System;
namespace Tornaado.Core
{
public class Log
{
public static void Debug(string line)
{
Console.WriteLine($"[DEBUG] {line}");
}
public static void Info(string line)
{
Console.WriteLine($"[INFO] {line}");
}
public static void Warn(string line)
{
Console.WriteLine($"[WARN] {line}");
}
public static void Error(string line)
{
Console.WriteLine($"[ERROR] {line}");
}
public static void Fatal(string line)
{
Console.WriteLine($"[FATAL] {line}");
}
}
}
I started rewriting my v38 (C#), I downloaded and installed Visual Studio 2017 RC on my Windows 7 VM, and done some stuff. I haven't actually done much yet but I want to finish up to client login at least this night. Things different:
- The project is now called Tornaado.
- XML configuration instead of INI configuration
- DotNetty sockets
- Fluent NHibernate with multiple DBMS support (MySQL, PostgreSQL, MSSQL, ...)
- C# 7.0
- NuGet packages
- Database generator
Some code:
PHP:public static void BuildSessionFactory() { var configuration = Fluently.Configure() .Database(MySQLConfiguration.Standard.ConnectionString((sb) => { sb.Server("127.0.0.1").Username("root").Password("").Database("tornaado_db"); }).Raw("hbm2ddl.keywords", "none")) .Mappings(m => m.FluentMappings.Add<MemberMap>()); _sessionFactory = configuration.BuildSessionFactory(); // following code is used to create all tables for example using the classmaps var exporter = new SchemaExport(configuration.BuildConfiguration()); exporter.Execute(true, true, false); }
PHP:using System; namespace Tornaado.Core { public class Log { public static void Debug(string line) { Console.WriteLine($"[DEBUG] {line}"); } public static void Info(string line) { Console.WriteLine($"[INFO] {line}"); } public static void Warn(string line) { Console.WriteLine($"[WARN] {line}"); } public static void Error(string line) { Console.WriteLine($"[ERROR] {line}"); } public static void Fatal(string line) { Console.WriteLine($"[FATAL] {line}"); } } }
There are 2 ways of starting the emulator and setting up the database, you could either use the database creator in order to create the tables etc. and insert data, or you can import a .sql file.
There will be a CMS made by me, it will most likely be done with Python using CherryPy (thanks Moogly for suggesting me it).
More code will come soon.
It's a better logging system, it allows you to configure multiple log outputs. It has the [same, debug, log, warn, error] mechanism, and is highly configurable with less code effort.@Dominic Thanks, I might do that. If I remember correctly, wasn't it faster?
using System.Collections.Generic;
using System.IO;
using System.Xml;
using System.Linq;
using System.Xml.Linq;
using System;
namespace Tornaado.Core
{
public class Configuration
{
private XmlDocument _document;
private Dictionary<string, Dictionary<string, string>> _values;
public Configuration(string file)
{
if (File.Exists(file))
{
_document = new XmlDocument();
_document.Load(file);
_values = new Dictionary<string, Dictionary<string, string>>();
CacheValues();
}
}
public void CacheValues()
{
foreach (XmlNode categoryNode in _document.GetElementsByTagName("configuration")[0].ChildNodes)
{
_values.Add(categoryNode.Name, new Dictionary<string, string>());
foreach (XmlNode itemNode in categoryNode.ChildNodes)
{
_values[categoryNode.Name].Add(itemNode.Name, itemNode.InnerText);
}
}
}
public string GetString(string category, string key)
{
string value = "";
return (from kvp
in _values
where kvp.Key == category && kvp.Value.TryGetValue(key, out value)
select value).FirstOrDefault();
}
public int GetInt(string category, string key)
{
int value = 0;
return (from kvp
in _values
where kvp.Key == category && kvp.Value.TryGetValue(key, out string rawval)
&& int.TryParse(rawval, out value)
select value).FirstOrDefault();
}
public uint GetUInt(string category, string key)
{
uint value = 0;
return (from kvp
in _values
where kvp.Key == category && kvp.Value.TryGetValue(key, out string rawval)
&& uint.TryParse(rawval, out value)
select value).FirstOrDefault();
}
public static implicit operator bool(Configuration configuration)
{
return configuration != null && configuration._document != null && configuration._values != null;
}
}
}
using DotNetty.Transport.Channels;
using Tornaado.Core;
using System.Text;
using DotNetty.Buffers;
using Tornaado.Utilities.Encoding;
using Tornaado.Game.Clients;
using Tornaado.Communication;
namespace Tornaado.Network.Game
{
internal class GameNetworkHandler : ChannelHandlerAdapter
{
public GameNetworkHandler()
{
}
public override void ChannelActive(IChannelHandlerContext ctx)
{
base.ChannelActive(ctx);
Engine.Game.GameClients.AddNewClient(ctx);
Log.Debug($"Client connected to client: {ctx.Channel.RemoteAddress.ToString()}");
}
public override void ChannelInactive(IChannelHandlerContext ctx)
{
base.ChannelInactive(ctx);
Engine.Game.GameClients.RemoveClient(ctx.Channel.Id);
Log.Debug($"Client disconnected from client: {ctx.Channel.RemoteAddress.ToString()}");
}
public override void ChannelReadComplete(IChannelHandlerContext context) => context.Flush();
public override void ChannelRead(IChannelHandlerContext ctx, object msg)
{
GameClient client = Engine.Game.GameClients.GetClient(ctx);
var message = msg as IByteBuffer;
if (message.ReadByte() == 60)
{
string policy = "<?xml version=\"1.0\"?>\r\n<!DOCTYPE cross-domain-policy SYSTEM \"/xml/dtds/cross-domain-policy.dtd\">\r\n<cross-domain-policy>\r\n <allow-access-from domain=\"*\" to-ports=\"1-65535\" />\r\n</cross-domain-policy>\0";
ctx.Channel.WriteAndFlushAsync(Unpooled.CopiedBuffer(Encoding.Default.GetBytes(policy))).Wait();
}
else
{
int length = Base64Encoding.Decode(message.ReadBytes(2).ToArray());
IByteBuffer packet = message.ReadBytes(length);
Engine.CommunicationHandler.Handle(client, new ClientMessage(packet));
}
base.ChannelRead(ctx, msg);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Tornaado.Core;
using Tornaado.Game.Clients;
namespace Tornaado.Communication
{
public class CommunicationHandler
{
private IDictionary<int, IMessageEvent> message_events;
public CommunicationHandler()
{
message_events = new Dictionary<int, IMessageEvent>();
// Code to automatically load
foreach (Type type in Assembly.GetExecutingAssembly().GetTypes())
{
if (type.Namespace.StartsWith("Tornaado.Communication.Incoming") && type.IsDefined(typeof(HabboPacketHeaderAttribute)) && type.GetInterfaces().Contains(typeof(IMessageEvent)))
{
HabboPacketHeaderAttribute attr = type.GetCustomAttribute(typeof(HabboPacketHeaderAttribute)) as HabboPacketHeaderAttribute;
IMessageEvent message_event = type.GetConstructor(Type.EmptyTypes).Invoke(new object[] { }) as IMessageEvent;
message_events.Add(attr.Header, message_event);
}
}
Log.Info($"Loaded {message_events.Count} message events.");
}
public void Handle(GameClient client, ClientMessage request)
{
if (message_events.TryGetValue(request.Header, out IMessageEvent message_event))
message_event.InvokeHandler(client, request);
else
Log.Debug($"[{request.Header}] Unregistered handler -> {request.ToString()}.");
}
}
}
using System;
using Tornaado.Game.Clients;
namespace Tornaado.Communication.Incoming.Handshake
{
[HabboPacketHeader(206)]
class InitCryptoMessageEvent : IMessageEvent
{
public void InvokeHandler(GameClient client, ClientMessage request)
{
}
}
}
using NHibernate;
using NHibernate.Criterion;
using Tornaado.Core;
using Tornaado.Models;
using Tornaado.Utilities.Bluedot;
namespace Tornaado.Game
{
public class GameMembers
{
public WeakCache<int, Member> MembersById { get; }
public WeakCache<string, Member> MembersByName { get; }
public GameMembers()
{
MembersById = new WeakCache<int, Member>((id) => GetMemberById(id));
MembersByName = new WeakCache<string, Member>((name) => GetMemberByName(name));
}
private Member GetMemberById(int id)
{
Member member;
using (ISession session = Engine.SessionFactory.OpenSession())
{
member = session.Get<Member>(id);
}
return member;
}
private Member GetMemberByName(string name)
{
Member member;
using (ISession session = Engine.SessionFactory.GetCurrentSession())
{
member = session.CreateCriteria<Member>().Add(Restrictions.Eq("name", name)).UniqueResult<Member>();
}
return member;
}
}
}
MembersById[KEY]
using NHibernate;
using System.Collections.Generic;
using Tornaado.Core;
using Tornaado.Models;
using Tornaado.Utilities.Bluedot;
using System;
using NHibernate.Criterion;
namespace Tornaado.Game.Help
{
public class FaqLoader
{
private IList<FaqCategories> faq_categories;
private IList<FaqTopics> faq_topics;
public WeakCache<int, FaqCategories> FaqCategoriesById { get; }
public WeakCache<int, FaqTopics> FaqTopicsById { get; }
public WeakCache<int, IList<FaqTopics>> FaqTopicsByCategory { get; }
public FaqLoader()
{
faq_categories = new List<FaqCategories>();
faq_topics = new List<FaqTopics>();
FaqCategoriesById = new WeakCache<int, FaqCategories>(GetCategory);
FaqTopicsById = new WeakCache<int, FaqTopics>(GetTopic);
FaqTopicsByCategory = new WeakCache<int, IList<FaqTopics>>(GetTopicsByCategory);
}
public void ReloadCategories()
{
using (ISession session = Engine.SessionFactory.OpenSession())
{
faq_categories = session.CreateCriteria<FaqCategories>().AddOrder(Order.Asc("id")).List<FaqCategories>();
}
Log.Info($"Loaded {faq_categories.Count} FAQ categories.");
}
public void ReloadTopics()
{
using (ISession session = Engine.SessionFactory.OpenSession())
{
faq_topics = session.CreateCriteria<FaqTopics>().AddOrder(Order.Asc("id")).List<FaqTopics>();
}
Log.Info($"Loaded {faq_categories.Count} FAQ topics.");
}
public IList<FaqCategories> GetCategories()
{
return faq_categories;
}
private IList<FaqTopics> GetTopicsByCategory(int categoryId)
{
IList<FaqTopics> topics = new List<FaqTopics>();
foreach (FaqTopics topic in faq_topics)
{
if (topic.FaqCategories.Id == categoryId)
topics.Add(topic);
}
return topics;
}
private FaqCategories GetCategory(int categoryId)
{
foreach (FaqCategories category in faq_categories)
{
if (category.Id == categoryId)
return category;
}
return null;
}
private FaqTopics GetTopic(int topicId)
{
foreach(FaqTopics topic in faq_topics)
{
if (topic.Id == topicId)
return topic;
}
return null;
}
}
}
@saamus Yes, I didn't have a proper name before, I changed it into Tornaado. Such goodness, much wow.