Example #1
0
        public static void StartLogin()
        {
            ushort loginPort = ServerConstants.LoginPort;

            byte[] loginIp;
            if (ServerConstants.LocalHost)
            {
                loginIp = ServerConstants.LocalHostIp;
            }
            else
            {
                loginIp = new byte[] { 0, 0, 0, 0 }
            };

            int i = 1;

            Console.ForegroundColor = ConsoleColor.White;
            Server server = new Server();

            server.OnClientConnected += MapleClientConnect;
            server.Start(new IPAddress(loginIp), loginPort);
            LoginServers.Add(server);
            ServerConsole.Info(String.Format("LoginServer[{0}] is running", i));
            server = new Server();
            server.Start(new IPAddress(loginIp), (ushort)(loginPort + 1)); //server for pinging, we dont rly want it to log everything
            i++;
        }
Example #2
0
 public static void StartCashShop()
 {
     CashShopServer = new Server();
     CashShopServer.OnClientConnected += MapleClientConnect;
     CashShopServer.Start(ServerConstants.LocalHost ? new IPAddress(ServerConstants.LocalHostIp) : IPAddress.Any, (ushort)ServerConstants.CashShopPort);
     ServerConsole.Info("CashShopServer is running");
 }
Example #3
0
        public static void LoadDataBuffers()
        {
            //DisabledQuikEdit();

            Stopwatch allData = new Stopwatch();

            allData.Start();
            int count = 0;

            count += DataProvider.LoadEtc(@".\NX\Etc.nx");

            ManualResetEvent[] handles = new ManualResetEvent[6];
            for (int i = 0; i < handles.Count(); i++)
            {
                handles[i] = new ManualResetEvent(false);
            }

            ThreadPool.QueueUserWorkItem(new WaitCallback(LoadMobs), handles[2]);
            ThreadPool.QueueUserWorkItem(new WaitCallback(LoadEquips), handles[0]);
            ThreadPool.QueueUserWorkItem(new WaitCallback(LoadItems), handles[1]);
            ThreadPool.QueueUserWorkItem(new WaitCallback(LoadSkills), handles[3]);
            ThreadPool.QueueUserWorkItem(new WaitCallback(LoadQuests), handles[4]);

            handles[2].WaitOne();                                                 //Wait for mob thread to finish
            ThreadPool.QueueUserWorkItem(new WaitCallback(LoadMaps), handles[5]); //Map needs mob wz info, so wait until mobs finished

            WaitHandle.WaitAll(handles);
            //Always do strings after the other WZs!
            count += DataProvider.LoadStrings(@".\NX\String.nx");
            ServerConsole.Info("{0} Strings loaded", count);

            ServerConsole.Info("Finished loading .NX in {0} ms", (int)allData.ElapsedMilliseconds);

            Stopwatch sw = new Stopwatch();

            sw.Start();
            count = DataProvider.LoadScripts();
            ServerConsole.Info("{0} Scripts loaded in {1} ms", count, (int)sw.ElapsedMilliseconds);
            sw.Reset();

            /*
             * sw.Start();
             * Count = LoadCashShopItems();
             * ServerConsole.Info(String.Format("{0} CashShop items loaded in {1} ms", Count, (int)sw.ElapsedMilliseconds));
             * sw.Reset();
             */
            sw.Start();
            count  = AdminCommands.ReloadCommands();
            count += GMCommands.ReloadCommands();
            count += PlayerCommands.ReloadCommands();
            count += DonorCommands.ReloadCommands();
            ServerConsole.Info("{0} Commands loaded in {1} ms", count, (int)sw.ElapsedMilliseconds);
            sw.Reset();
            LoadMonsterDrops();
            allData.Stop();
            ServerConsole.Info("All data loaded in {0} ms", (int)allData.ElapsedMilliseconds);
            ServerConsole.Info("==============================================");
        }
Example #4
0
        public static void ReceivePacket(string[] split, MapleClient c)
        {
            string       packet = split.Fuse(1);
            PacketWriter pw     = new PacketWriter();

            pw.WriteHexString(packet);
            c.SendPacket(pw);
            ServerConsole.Info("Player sent packet to himself: " + pw.ToString());
        }
Example #5
0
        public static void LoadQuests(object r)
        {
            Stopwatch sw    = Stopwatch.StartNew();
            int       count = DataProvider.LoadQuests(@".\NX\Quest.nx");

            ServerConsole.Info("{0} Quests loaded in {1} ms", count, sw.ElapsedMilliseconds);
            sw.Stop();
            ((ManualResetEvent)r).Set();
        }
Example #6
0
        public static void Select(MapleClient c, PacketReader pr)
        {
            if (pr.Available == 0)
            {
                return;
            }
            byte Type = pr.ReadByte();

            switch (Type)
            {
            case 0x65:     //Select cat
                int Cat = pr.ReadInt();
                Cat %= 1000000;
                int subCat = Cat;
                subCat %= 10000;
                Cat     = (int)Math.Floor((decimal)Cat / 10000);
                subCat  = (int)Math.Floor((decimal)subCat / 100);
                if (Cat == 0)
                {
                    return;
                }
                if (subCat == 1)
                {
                    return;
                }
                ShowCatItems(c, Cat, subCat);
                break;

            case 0x66:     //Leave CashShop
                byte Channel = c.Account.MigrationData.ReturnChannel;
                ChangeChannelHandler.Handle(c, new PacketReader(new byte[] { (byte)(Channel) }));
                break;

            case 0x67:     //Add Fav
            case 0x68:     //Remove Fav
                pr.ReadByte();
                AddFav(c, pr.ReadInt());
                break;

            case 0x69:     //Like
                int SN = pr.ReadInt();
                AddLike(c, SN);
                break;

            case 0x6D:     //Select fav
                ShowFav(c);
                break;

            default:
                ServerConsole.Warning("Unknow CashshopSelectType : {0}", Type);
                ServerConsole.Info(Functions.ByteArrayToStr(pr.ToArray()));
                break;
            }
        }
Example #7
0
        public static void LoadMonsterDrops()
        {
            Stopwatch sw = new Stopwatch();

            sw.Start();
            int count = 0;

            count  = DataProvider.LoadMobDrops();
            count += DataProvider.LoadGlobalDrops();
            sw.Stop();
            ServerConsole.Info(String.Format("{0} Monsterdrops loaded in {1} ms", count, (int)sw.ElapsedMilliseconds));
        }
Example #8
0
        private static void StartDataApi()
        {
            HttpSelfHostConfiguration config = new HttpSelfHostConfiguration(ServerConstants.dataApiUrl);

            config.Routes.MapHttpRoute(
                "DataApi", "{controller}/{action}/{param}",
                new { param = RouteParameter.Optional });
            dataApi = new HttpSelfHostServer(config);
            //dataApi.OpenAsync().Wait();

            ServerConsole.Info(String.Format("DataApi running on {0}", ServerConstants.dataApiUrl));
        }
Example #9
0
 public MapleClient(Socket session)
 {
     SClient = new CClientSocket(this, session);
     Host    = SClient.Host;
     Port    = SClient.Port;
     ServerConsole.Info(String.Format("{0}:{1} Connnected", Host, Port));
     Channel         = 1;
     Connected       = true;
     LastPacketsSent = new LimitedQueue <PacketWriter>(10);
     CheatTracker    = new OffenceTracker()
     {
         Client = this
     };
 }
Example #10
0
        public void SendPacket(PacketWriter packet)
        {
            if (ServerConstants.PrintPackets)
            {
                ServerConsole.Info(String.Format("Sending: {0}", Functions.ByteArrayToStr(packet.ToArray())));
            }

            if (SClient == null)
            {
                return;
            }

            SClient.SendPacket(packet);
            //LastPacketsSent.Enqueue(packet);
        }
Example #11
0
        public static void Initialize()
        {
            ServerConsole.Info("\t# loading Skill Tree...");
            Stopwatch watch = Stopwatch.StartNew();

            string filepath = Core.Conf.ConfigDir + "/Database/CharacterSkillTree.xml";

            Tree = new SkillTree();

            Tree = Parser.ParseSkillTree(filepath);

            ServerConsole.WriteLine(EConsoleColor.Status, " done in " + watch.ElapsedMilliseconds + "ms");
            watch.Stop();
            watch = null;
        }
Example #12
0
        public static void Initialize()
        {
            ServerConsole.Info("\t# loading fame lists...");
            // TODO: some sort of dynamic class lists would be nice to have..
            string jobsBlacksmith = string.Concat((int)EClass.Blacksmith, ',', (int)EClass.BabyBlacksmith, ',', (int)EClass.Whitesmith);
            string jobsAlchemist  = string.Concat((int)EClass.Alchemist, ',', (int)EClass.BabyAlchemist, ',', (int)EClass.Creator);
            string jobsTaekwon    = string.Concat((int)EClass.Taekwon);
            int    size           = 10;

            // Load from database
            Blacksmith = ReadFameList(jobsBlacksmith, size);
            Alchemist  = ReadFameList(jobsAlchemist, size);
            Taekwon    = ReadFameList(jobsTaekwon, size);

            ServerConsole.WriteLine(EConsoleColor.Status, " Done (" + Blacksmith.Count + " blacksmith, " + Alchemist.Count + " Alchemist, " + Taekwon.Count + " Taekwon)");
        }
Example #13
0
        internal void Disconnected()
        {
            MapleCharacter save = null;

            if (Account != null)
            {
                save = Account.Character;
            }

            try
            {
                if (Account != null)
                {
                    Account.Release(); //It is imperative to release the account before removing the client from the server.
                }
            }
            catch { }
            try
            {
                if (Connected)
                {
                    ServerConsole.Info(String.Format("{0}:{1} Disconnected", Host, Port));
                }
                Connected = false;
                Program.RemoveClient(this);
                if (save != null)
                {
                    save.LoggedOut();
                }
            }
            catch { }
            try
            {
                if (NpcEngine != null)
                {
                    NpcEngine.Dispose();
                }
            }
            catch { }
            try
            {
                SClient.Dispose();
            }
            catch { }
        }
Example #14
0
        public static void StartChannels()
        {
            ushort channelStartPort = ServerConstants.ChannelStartPort;
            byte   i            = 0;
            byte   channelCount = ServerConstants.Channels;

            while (i < channelCount)
            {
                ChannelServer channelServer = new ChannelServer(i);
                channelServer.OnClientConnected += MapleClientConnect;
                ushort port = (ushort)(channelStartPort + i);
                channelServer.Start(ServerConstants.LocalHost ? new IPAddress(ServerConstants.LocalHostIp) : IPAddress.Any, port);
                ChannelServers.Add((byte)(i), channelServer);
                ServerConsole.Info(String.Format("ChannelServer[{0}] is running on port {1}", i + 1, port));
                i++;
            }
            ServerConsole.Info("Server and channels are running.");
            ServerConsole.Info("To safely stop the server type 'exit'");
        }
Example #15
0
        public static void Handle(PacketReader packet, MapleClient c)
        {
            if (packet.Length >= 2)
            {
                if (ServerConstants.PrintPackets)
                {
                    ServerConsole.Info("Receiving: {0}", Functions.ByteArrayToStr(packet.ToArray()));
                }
                RecvHeader header = (RecvHeader)packet.ReadHeader();

                if (header <= RecvHeader.ErrorCode)
                {
                    switch (header)
                    {
                        #region Miscellaneous
                    case RecvHeader.ErrorCode:
                        ErrorCodeHandler.Handle(c, packet);
                        break;

                    case RecvHeader.BlackCipher:
                        BlackCipherHandler.Handle(packet.ReadInt(), c);
                        break;

                    case RecvHeader.HandShake:
                        ReceiveHandShakeHandler.Handle(c, packet);
                        break;

                    case RecvHeader.CrashReport:
                        break;

                    case RecvHeader.Pong:
                        PongHandler.Handle(c);
                        break;

                        #endregion
                        #region Login Server
                    case RecvHeader.EnteredLoginScreen:
                        EnteredLoginScreenHandler.Handle(c);
                        break;

                    case RecvHeader.ClientLoaded:
                        ClientLoadedHandler.Handle(c);
                        break;

                    case RecvHeader.ShowServerList:
                    case RecvHeader.ReShowServerList:
                        ServerlistRequestHandler.Handle(c);
                        break;

                    case RecvHeader.WorldSelect:
                        WorldSelectHandler.Handle(packet.ReadShort(), c);
                        break;

                    case RecvHeader.CheckCharacterName:
                        CheckCharnameHandler.Handle(c, packet.ReadMapleString());
                        break;

                    case RecvHeader.CreateCharacter:
                        CreateCharHandler.Handle(c, packet);
                        break;

                    case RecvHeader.DeleteCharacter:
                        DeleteCharacterHandler.Handle(c, packet);
                        break;

                    case RecvHeader.SetAccountPic:
                        SetAccountPicHandler.Handle(c, packet);
                        break;

                    case RecvHeader.ChooseCharacterWithPic:
                        ChooseCharWithPicHandler.Handle(c, packet);
                        break;

                    case RecvHeader.EnterMap:
                        CharacterLoginHandler.Handle(c, packet);
                        break;

                    case RecvHeader.AccountLogin:
                        LoginAccountHandler.Handle(c, packet);
                        break;

                    case RecvHeader.ChooseChannel:
                        ChooseChannelHandler.Handle(c, packet);
                        break;

                        #endregion
                    default:
#if DEBUG
                        ServerConsole.Debug("Unhandled recv packet: {0}", Functions.ByteArrayToStr(packet.ToArray()));
#endif
                        break;
                    }
                }
                else
                {
                    if (c.Account?.Character?.Map == null)
                    {
                        return;
                    }
                    switch (header)
                    {
                        #region GameServer
                    // Spam packets:
                    case RecvHeader.ClickDialog:
                    case RecvHeader.AttackSpam:
                    case RecvHeader.FinalPactEnd:
                        break;

                    case RecvHeader.PartyResponse:
                        PartyResponseHandler.Handle(c, packet);
                        break;

                    case RecvHeader.PartyOperation:
                        PartyHandler.Handle(c, packet);
                        break;

                    case RecvHeader.RequestRecommendedPartyMembers:
                        RecommendedPartyMembersHandler.Handle(c, packet);
                        break;

                    case RecvHeader.CharacterReceiveDamage:
                        CharacterReceiveDamage.Handle(c, packet);
                        break;

                    case RecvHeader.PlayerChat:
                        PlayerChatHandler.Handle(c, packet);
                        break;

                    case RecvHeader.SpecialChat:
                        SpecialChatHandler.Handle(c, packet);
                        break;

                    case RecvHeader.RequestWeeklyMapleStar:
                        WeeklyMapleStarHandler.Handle(c, packet);
                        return;

                    case RecvHeader.MoveCharacter:
                        MoveCharacterHandler.Handle(c, packet);
                        break;

                    case RecvHeader.EnterMapPortal:
                        EnterMapPortalHandler.Handle(c, packet);
                        break;

                    case RecvHeader.EnterDoor:
                        EnterDoorHandler.Handle(c, packet);
                        break;

                    case RecvHeader.MoveMob:
                        MoveMobHandler.Handle(c, packet);
                        break;

                    case RecvHeader.NpcChat:
                        NpcChatHandler.Handle(c, packet);
                        break;

                    case RecvHeader.NpcShopAction:
                        NpcShopActionHandler.Handle(c, packet);
                        break;

                    case RecvHeader.NpcAnimation:
                        NpcAnimationHandler.Handle(c, packet);
                        break;

                    case RecvHeader.NpcChatMore:
                        NpcChatMoreHandler.Handle(c, packet);
                        break;

                    case RecvHeader.FacialExpression:
                        FacialExpressionHandler.Handle(c, packet);
                        break;

                    case RecvHeader.MeleeAttack:
                        DealDamageHandler.HandleMelee(c, packet, header);
                        break;

                    case RecvHeader.RangedAttack:
                        DealDamageHandler.HandleRanged(c, packet);
                        break;

                    case RecvHeader.PassiveAttack:
                    case RecvHeader.MagicAttack:
                        DealDamageHandler.HandleMagic(c, packet);
                        break;

                    case RecvHeader.DistributeAp:
                        DistributeAPHandler.HandleSingle(c, packet);
                        break;

                    case RecvHeader.AutoAssignAp:
                        DistributeAPHandler.HandleDistribute(c, packet);
                        break;

                    case RecvHeader.DistributeSp:
                        DistributeSPHandler.Handle(c, packet);
                        break;

                    case RecvHeader.UseSkill:
                        UseSkillHandler.Handle(c, packet);
                        break;

                    case RecvHeader.MoveItem:
                        MoveItemHandler.Handle(c, packet);
                        break;

                    case RecvHeader.SlotMerge:
                        InventorySortHandler.HandleSlotMerge(c, packet);
                        break;

                    case RecvHeader.ItemSort:
                        InventorySortHandler.HandleItemSort(c, packet);
                        break;

                    case RecvHeader.ChangeChannel:
                        ChangeChannelHandler.Handle(c, packet);
                        break;

                    case RecvHeader.EnterCashShop:
                        EnterCSHandler.Handle(c, packet);
                        break;

                    case RecvHeader.AutoAggroMob:
                        AutoAggroHandler.Handle(c, packet);
                        break;

                    case RecvHeader.LootMapItem:
                        LootItemHandler.HandlePlayer(c, packet);
                        break;

                    case RecvHeader.RegenerateHpMp:
                        RegenerateHPMPHandler.Handle(c, packet);
                        break;

                    case RecvHeader.ChangeKeybind:
                        KeybindHandler.HandleKeyMapChange(c, packet);
                        break;

                    case RecvHeader.QuickSlotKeyMap:
                        KeybindHandler.HandleQuickSlotKeysChange(c, packet);
                        break;

                    case RecvHeader.CancelBuff:
                        CancelBuffHandler.Handle(c, packet);
                        break;

                    case RecvHeader.CharacterInfoRequest:
                        CharacterInfoRequest.Handle(c, packet);
                        break;

                    case RecvHeader.QuestAction:
                        QuestActionHandler.Handle(c, packet);
                        break;

                    case RecvHeader.EnterMapPortalSpecial:
                        EnterMapPortalSpecialHandler.Handle(c, packet);
                        break;

                    case RecvHeader.GuildAction:
                        GuildActionHandler.Handle(c, packet);
                        break;

                    case RecvHeader.DropMeso:
                        DropMesoHandler.Handle(c, packet);
                        break;

                    case RecvHeader.Trade:
                        TradeHandler.Handle(c, packet);
                        break;

                    case RecvHeader.UseConsumable:
                        UseItemHandler.Handle(c, packet);
                        break;

                    case RecvHeader.UseReturnScroll:
                        UseItemHandler.HandleReturnScroll(c, packet);
                        break;

                    case RecvHeader.UseEquipScroll:
                        UseScrollHandler.HandleRegularEquipScroll(c, packet);
                        break;

                    case RecvHeader.UseSpecialEquipScroll:
                        UseScrollHandler.HandleSpecialEquipScroll(c, packet);
                        break;

                    case RecvHeader.UseEquipEnhancementScroll:
                        UseScrollHandler.HandleEquipEnhancementScroll(c, packet);
                        break;

                    case RecvHeader.UseCashItem:
                        UseSpecialItemHandler.Handle(c, packet);
                        break;

                    case RecvHeader.UsePotentialScroll:
                        UseScrollHandler.HandlePotentialScroll(c, packet);
                        break;

                    case RecvHeader.UseBonusPotentialScroll:
                        UseScrollHandler.HandleBonusPotentialScroll(c, packet);
                        break;

                    case RecvHeader.UseCube:
                        UseScrollHandler.HandleCube(c, packet);
                        break;

                    case RecvHeader.UseMagnifyGlass:
                        UseMagnifyingGlassHandler.Handle(c, packet);
                        break;

                    case RecvHeader.SetSkillMacro:
                        SetSkillMacroHandler.Handle(c, packet);
                        break;

                    case RecvHeader.ProffesionReactorAction:
                        ProfessionReactorActionHandler.Handle(c, packet);
                        break;

                    case RecvHeader.ProffesionReactorDestroy:
                        ProfessionReactorActionHandler.HandleDestroy(c, packet);
                        break;

                    case RecvHeader.ReactorAction:
                        ReactorActionHandler.Handle(c, packet);
                        break;

                    case RecvHeader.CraftDone:
                        CraftHandler.HandleCraftDone(c, packet);
                        break;

                    case RecvHeader.CraftEffect:
                        CraftHandler.HandleCraftEffect(c, packet);
                        break;

                    case RecvHeader.CraftMake:
                        CraftHandler.HandleCraftMake(c, packet);
                        break;

                    case RecvHeader.CraftUnk:
                        CraftHandler.HandleUnk(c, packet);
                        break;

                    case RecvHeader.GainAranCombo:
                        AranComboHandler.HandleGain(c);
                        break;

                    case RecvHeader.DecayAranCombo:
                        AranComboHandler.HandleDecay(c);
                        break;

                    case RecvHeader.BlackBlessing:
                        BlackBlessingHandler.Handle(c);
                        break;

                    case RecvHeader.RequestHyperskillInfo:
                        HyperskillInfoRequestHandler.Handle(c, packet);
                        return;

                    case RecvHeader.SkillSwipe:
                        StealSkillHandler.HandleSkillSwipe(c, packet);
                        break;

                    case RecvHeader.ChooseStolenSkill:
                        StealSkillHandler.HandleChooseSkill(c, packet);
                        break;

                    case RecvHeader.StealSkill:
                        StealSkillHandler.HandleStealSkill(c, packet);
                        break;

                    case RecvHeader.MessengerOperation:
                        MapleMessengerHandler.Handle(c, packet);
                        break;

                    case RecvHeader.MoveSummon:
                        SummonHandler.HandleMove(c, packet);
                        break;

                    case RecvHeader.SummonAttack:
                        SummonHandler.HandleAttack(c, packet);
                        break;

                    case RecvHeader.SummonUseSkill:
                        SummonHandler.HandleSkill(c, packet);
                        break;

                    case RecvHeader.RemoveSummon:
                        SummonHandler.HandleRemove(c, packet);
                        break;

                    case RecvHeader.FindPlayer:
                        FindPlayerHandler.Handle(c, packet);
                        break;

                    case RecvHeader.BuddyOperation:
                        BuddyOperationHandler.Handle(c, packet);
                        break;

                    case RecvHeader.UseGoldenHammer:
                        UseGoldenHammerHandler.Handle(c, packet);
                        break;

                        #endregion
                        #region CashShop
                    case RecvHeader.CashshopSelect:
                        CashShop.Select(c, packet);
                        break;

                        #endregion
                    default:
#if DEBUG
                        ServerConsole.Debug("Unhandled recv packet: {0}", Functions.ByteArrayToStr(packet.ToArray()));
#endif
                        c.Account.Character.EnableActions();
                        break;
                    }
                }
            }
        }
        public static void Handle(MapleClient c, PacketReader pr)
        {
            try
            {
                if (c.NpcEngine != null && c.NpcEngine.IsShop)
                {
                    byte mode  = pr.ReadByte();
                    int  NpcId = c.NpcEngine.NpcId;
                    switch (mode)
                    {
                    case 0:
                    {
                        short shopIndex = pr.ReadShort();
                        int   itemId    = pr.ReadInt();
                        short amount    = pr.ReadShort();
                        c.NpcEngine.BuyItem(itemId, shopIndex, amount);
                        break;
                    }

                    case 1:     //sell
                    {
                        short inventoryIndex = pr.ReadShort();
                        int   itemId         = pr.ReadInt();
                        short qty            = pr.ReadShort();

                        MapleInventoryType invType = ItemConstants.GetInventoryType(itemId);
                        switch (invType)
                        {
                        case MapleInventoryType.Equip:
                        case MapleInventoryType.Etc:
                        case MapleInventoryType.Setup:
                        case MapleInventoryType.Use:
                            break;

                        default:
                            return;         // Not a valid item
                        }
                        WzItem wzitem = DataBuffer.GetItemById(itemId);
                        if (wzitem == null)
                        {
                            wzitem = DataBuffer.GetEquipById(itemId);
                        }
                        if (wzitem == null)     // Item doesnt exist (anymore?)
                        {
                            return;
                        }
                        if (wzitem.NotSale || wzitem.IsCashItem || wzitem.IsQuestItem)
                        {
                            return;
                        }
                        byte response = 0;
                        if (!wzitem.IsQuestItem)
                        {
                            MapleInventory inventory = c.Account.Character.Inventory;
                            MapleItem      item      = inventory.GetItemSlotFromInventory(invType, inventoryIndex);
                            if (item?.ItemId == itemId && item.Quantity >= qty)
                            {
                                if (inventory.Mesos + wzitem.Price > GameConstants.MAX_MESOS)
                                {
                                    response = 2;     // You do not have enough mesos
                                }
                                else
                                {
                                    inventory.RemoveItemsFromSlot(item.InventoryType, item.Position, qty, true);
                                    inventory.GainMesos(wzitem.Price * qty, false, false);
                                }
                                // TODO: buyback
                            }
                        }
                        PacketWriter pw = new PacketWriter();
                        pw.WriteHeader(SendHeader.NpcTransaction);
                        pw.WriteByte(response);
                        pw.WriteByte(0);
                        pw.WriteByte(0);
                        c.SendPacket(pw);
                        break;
                    }

                    case 3:
                    {
                        c.NpcEngine.Dispose();
                        break;
                    }

                    default:
                    {
                        c.NpcEngine.ScriptInstance = null;
                        ServerConsole.Warning("Unkown NpcShopActionHandler mode:" + mode);
                        ServerConsole.Info(Functions.ByteArrayToStr(pr.ToArray()));
                        break;
                    }
                    }
                }
            }
            catch (Exception ex)
            {
                ServerConsole.Error("NpcShopActionHandler Failure");
                ServerConsole.Error(ex.Message);
                if (c.NpcEngine != null)
                {
                    c.NpcEngine.Dispose();
                }
            }
        }
Example #17
0
        public static void Load()
        {
            if (Loaded == true || Loading == true)
            {
                return;
            }

            Loading = true;
            // Trigger events for scripts
            Events.InvokeWorldLoadStart();

            // Our object manager for databsae objects
            Database = new DatabaseObjectManager();
            // Our object manager for world objects (spawned objects)
            Objects = new WorldObjectManager();

            // Delegate for Send() Method
            mForeachInRangeCallback = new ForeachInRangeVoidDelegate(SendSub);

            mAddQueue = new Queue <DatabaseObject>();
            mDelQueue = new Queue <DatabaseObject>();

            // Load globals from config, initialize packets ect
            ServerConsole.InfoLine("Initialize game symantics...");
            Global.Initialize();
            WorldObjectStatus.Initialize();
            ChatHelper.Initialize();
            PlayerCommandHelper.Initialize();
            PathHelper.Initialize();
            SkillTree.Initialize();
            FameListHelper.Initialize();
            CharacterJobBonus.Initialize();
            CharacterJobModifer.Initialize();

            // Real database loading
            ServerConsole.InfoLine("Begin World loading...");

            DataTable table    = null;
            Stopwatch watchAll = Stopwatch.StartNew();
            Stopwatch watch    = Stopwatch.StartNew();

            //------------- loading start -------------

            #region Mapcache
            ServerConsole.Info("\t# loading Maps from mapcache...");
            watch.Reset();
            watch.Start();
            Mapcache.Initialize();
            watch.Stop();
            ServerConsole.WriteLine(EConsoleColor.Status, " done (" + Mapcache.Maps.Count + " Maps in " + watch.ElapsedMilliseconds + "ms)");
            #endregion


            #region Items
            ServerConsole.Info("\t# loading Items...");
            watch.Reset();
            watch.Start();
            table           = Core.Database.Query("SELECT * FROM dbitem");
            table.TableName = "ItemDB Table";


            if (table == null || table.Rows.Count == 0)
            {
                if (Core.Database.LastError != null)
                {
                    ServerConsole.ErrorLine("failed to load Item Database!");
                    ServerConsole.WriteLine(Core.Database.LastError.ToString());
                }
            }
            else
            {
                ItemDatabaseData item;
                for (int i = 0; i < table.Rows.Count; i++)
                {
                    item = ItemDatabaseData.Load(table.Rows[i]);
                    if (item == null)
                    {
                        ServerConsole.WarningLine("Failed to load item {0}: #{1} {2}", i, table.Rows[i].Field <int>("itemID"), table.Rows[i].Field <string>("nameEnglish"));
                        continue;
                    }
                    Database.Add(item);

                    //ServerConsole.DebugLine("\tLoad: #{0} {1}", item.NameID.ToString().PadLeft(5), item.Name);
                }
            }
            watch.Stop();
            ServerConsole.WriteLine(EConsoleColor.Status, " done (" + Database.Items.Count + " Items in " + watch.ElapsedMilliseconds + "ms)");
            #endregion


            #region Monster
            ServerConsole.Info("\t# loading Mobs...");
            watch.Reset();
            watch.Start();
            table           = Core.Database.Query("SELECT * FROM dbmob");
            table.TableName = "MobDB Table";
            if (table == null || table.Rows.Count == 0)
            {
                if (Core.Database.LastError != null)
                {
                    ServerConsole.ErrorLine("failed to load Monster Database!");
                    ServerConsole.WriteLine(Core.Database.LastError.ToString());
                }
            }
            else
            {
                MonsterDatabaseData mob;
                for (int i = 0; i < table.Rows.Count; i++)
                {
                    mob = MonsterDatabaseData.Load(table.Rows[i]);
                    if (mob == null)
                    {
                        ServerConsole.WarningLine("Failed to load mob {0}: #{1} {2}", i, table.Rows[i].Field <int>("mobID"), table.Rows[i].Field <string>("nameInter"));
                        continue;
                    }
                    Database.Add(mob);

                    //ServerConsole.DebugLine("\tLoad: #{0} {1} ({2} drops, {3} skills)", mob.ID.ToString().PadLeft(5), mob.NameInter, mob.Drops.Count, mob.Skills.Count);
                }
            }
            watch.Stop();
            ServerConsole.WriteLine(EConsoleColor.Status, " done (" + Database.Monster.Count + " Mobs in " + watch.ElapsedMilliseconds + "ms)");


            ServerConsole.Info("\t# loading Mob Skills...");
            watch.Reset();
            watch.Start();
            table           = Core.Database.Query("SELECT * FROM dbmob_skill ORDER BY mobID ASC");
            table.TableName = "MobDB Skill Table";
            if (table == null || table.Rows.Count == 0)
            {
                if (Core.Database.LastError != null)
                {
                    ServerConsole.ErrorLine("failed to load Mob Skill Database!");
                    ServerConsole.WriteLine(Core.Database.LastError.ToString());
                }
            }
            else
            {
                MonsterSkill mobSkill;
                for (int i = 0; i < table.Rows.Count; i++)
                {
                    mobSkill = MonsterSkill.Load(table.Rows[i]);
                    if (mobSkill == null)
                    {
                        throw new Exception(string.Format("Failed to load mob skill #{0}: {1}", table.Rows[i].Field <int>("mobID"), table.Rows[i].Field <string>("info")));
                    }

                    (Database[EDatabaseType.Mob, mobSkill.MobID] as MonsterDatabaseData).Skills.Add(mobSkill);

                    //ServerConsole.DebugLine("\tLoad: #{0} {1} ({2} level)", skill.ID.ToString().PadLeft(5), skill.Name, skill.Level.Count);
                }
            }
            watch.Stop();
            ServerConsole.WriteLine(EConsoleColor.Status, " done in " + watch.ElapsedMilliseconds + "ms");


            ServerConsole.Info("\t# loading Mob Drops...");
            watch.Reset();
            watch.Start();
            table           = Core.Database.Query("SELECT * FROM dbmob_drop ORDER BY mobID ASC");
            table.TableName = "MobDB Drop Table";
            if (table == null || table.Rows.Count == 0)
            {
                if (Core.Database.LastError != null)
                {
                    ServerConsole.ErrorLine("failed to load Mob Drop Database!");
                    ServerConsole.WriteLine(Core.Database.LastError.ToString());
                }
            }
            else
            {
                MonsterDrop drop;
                for (int i = 0; i < table.Rows.Count; i++)
                {
                    drop = MonsterDrop.Load(table.Rows[i]);

                    (Database[EDatabaseType.Mob, drop.MobID] as MonsterDatabaseData).Drops.Add(drop);

                    //ServerConsole.DebugLine("\tLoad: #{0} {1} ({2} level)", skill.ID.ToString().PadLeft(5), skill.Name, skill.Level.Count);
                }
            }
            watch.Stop();
            ServerConsole.WriteLine(EConsoleColor.Status, " done in " + watch.ElapsedMilliseconds + "ms");
            #endregion


            #region General Skills
            ServerConsole.Info("\t# loading Skills...");
            watch.Reset();
            watch.Start();
            table           = Core.Database.Query("SELECT * FROM dbskill");
            table.TableName = "SkillDB Table";
            if (table == null || table.Rows.Count == 0)
            {
                if (Core.Database.LastError != null)
                {
                    ServerConsole.ErrorLine("failed to load Skill Database!");
                    ServerConsole.WriteLine(Core.Database.LastError.ToString());
                }
            }
            else
            {
                SkillDatabaseData skill;
                for (int i = 0; i < table.Rows.Count; i++)
                {
                    skill = SkillDatabaseData.Load(table.Rows[i]);
                    if (skill == null)
                    {
                        ServerConsole.WarningLine("Failed to load skill {0}: #{1} {2}", i, table.Rows[i].Field <int>("skillID"), table.Rows[i].Field <string>("name"));
                        continue;
                    }
                    Database.Add(skill.Index, skill);

                    //ServerConsole.DebugLine("\tLoad: #{0} {1} ({2} level)", skill.ID.ToString().PadLeft(5), skill.Name, skill.Level.Count);
                }
            }
            watch.Stop();
            ServerConsole.WriteLine(EConsoleColor.Status, " done (" + Database.Skill.Count + " Skills in " + watch.ElapsedMilliseconds + "ms)");
            #endregion


            // Loading other shit
            // o.o

            //------------- loading end -------------

            // Trigger event for scripts
            Events.InvokeWorldLoadFinish();

            Loading = false;
            Loaded  = true;

            ProcessSafetyQueues();

            // TODO: Initialize save timer

            ServerConsole.InfoLine("Finished World loading! Needed {0:F2} sec", watchAll.Elapsed.TotalSeconds);

            watch.Stop();
            watch = null;
            watchAll.Stop();
            watchAll = null;
        }
Example #18
0
        public static void LoadFromFile()
        {
            const string path = "./ServerConstants.ini";

            if (File.Exists(path))
            {
                string[] lines = File.ReadAllLines(path);

                Dictionary <string, string> properties = new Dictionary <string, string>();
                foreach (string line in lines)
                {
                    if (line.Length > 2 && line.Contains('=') && !line.StartsWith(";"))
                    {
                        string[] splittedLine = line.Split('=');
                        if (splittedLine.Length == 2)
                        {
                            properties.Add(splittedLine[0], splittedLine[1]);
                        }
                        else if (splittedLine.Length > 2)
                        {
                            properties.Add(splittedLine[0], splittedLine.Fuse(1, "="));
                        }
                    }
                }

                //set settings
                if (properties.ContainsKey(TAG_EXPRATE))
                {
                    ExpRate = GetInt(properties, TAG_EXPRATE);
                }

                if (properties.ContainsKey(TAG_MESORATE))
                {
                    MesoRate = GetInt(properties, TAG_MESORATE);
                }
                if (properties.ContainsKey(TAG_DROPRATE))
                {
                    DropRate = GetInt(properties, TAG_DROPRATE);
                }
                if (properties.ContainsKey(TAG_QUEST_EXPRATE))
                {
                    QuestExpRate = GetInt(properties, TAG_QUEST_EXPRATE);
                }

                if (properties.ContainsKey(TAG_MOBSPAWN))
                {
                    MonsterSpawnInterval = GetInt(properties, TAG_MOBSPAWN);
                }

                if (properties.ContainsKey(TAG_LOGINPORT))
                {
                    LoginPort = (ushort)GetInt(properties, TAG_LOGINPORT);
                }
                if (properties.ContainsKey(TAG_CHANNEL_START_PORT))
                {
                    ChannelStartPort = (ushort)GetInt(properties, TAG_CHANNEL_START_PORT);
                }
                if (properties.ContainsKey(TAG_CHANNEL_COUNT))
                {
                    Channels = (byte)GetInt(properties, TAG_CHANNEL_COUNT);
                }

                if (properties.ContainsKey(TAG_PRINT_PACKETS))
                {
                    PrintPackets = GetBool(properties, TAG_PRINT_PACKETS);
                }
                if (properties.ContainsKey(TAG_LOCALHOST))
                {
                    LocalHost = GetBool(properties, TAG_LOCALHOST);
                }

                if (properties.ContainsKey(TAG_DB_CONNECTION_STRING))
                {
                    DatabaseString = GetString(properties, TAG_DB_CONNECTION_STRING);
                }


                ServerConsole.Info("ServerConstants.ini loaded");
            }
            else
            {
                ServerConsole.Warning("ServerConstants.ini not found, using default values");
            }
        }
Example #19
0
        public static void Main(string[] args)
        {
            // If we set the exceptionhandler also in debug, VS wont throw them and i cant react in Debug-mode
            // They will be printed to the console interface
#if !DEBUG
            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
#endif
            AppDomain.CurrentDomain.ProcessExit += new EventHandler(CurrentDomain_ProcessExit);
#if !DEBUG
            try {
#endif

            // Cleanup before loading any other data
            GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);

            // Save some infos about our thread and assembly
            mThread   = Thread.CurrentThread;
            mProcess  = Process.GetCurrentProcess();
            mAssembly = Assembly.GetEntryAssembly();
            if (mThread != null)
            {
                // We set a name on our core thread
                mThread.Name = "Core Thread";
            }

            // Initialize our timer manager
            TimerThread ttObj = new TimerThread();
            mTimerThread      = new Thread(new ThreadStart(ttObj.TimerMain));
            mTimerThread.Name = "Timer Thread";

            // Prepare console for a large output
            int width = Math.Min(100, Console.LargestWindowWidth - 2);
            Console.CursorVisible = false;
            Console.Clear();
            Console.WindowLeft = Console.WindowTop = 0;
            if (Console.WindowWidth < width)
            {
                Console.WindowWidth = width;
            }

            // Real fullscreen mode *_*
#if REAL_FULLSCREEN
            IntPtr hConsole = GetStdHandle(-11);
            SetConsoleDisplayMode(hConsole, 0);
#endif

            // Set colors for the logo printer
            LogoPrinter.PrefixColor    = EConsoleColor.Blue;
            LogoPrinter.SufixColor     = EConsoleColor.Blue;
            LogoPrinter.TextColor      = EConsoleColor.Gray;
            LogoPrinter.CopyrightColor = EConsoleColor.Status;
            LogoPrinter.PrintLogo();

            // Output some infos about version and that
            Version ver = mAssembly.GetName().Version;
            ServerConsole.StatusLine("Rovolution Server - Version {0}.{1}.{2}.{3}", ver.Major, ver.Minor, ver.Build, ver.Revision);

            // Set error and exception handler (dll import)
            mConsoleEventHandler = new ConsoleEventHandler(OnConsoleEvent);
            SetConsoleCtrlHandler(mConsoleEventHandler, true);

            // Read server config
            mAppConf = new ApplicationSettings();
            mAppConf.ReadAll();

            // Mysql init
            Stopwatch watch = Stopwatch.StartNew();
            ServerConsole.Info("Connecting to SQL Server {0}...", mAppConf.Connection["DB Server"]);
            mDatabase = new RovolutionDatabase(Conf.Connection["DB Server"], int.Parse(Conf.Connection["DB Port"]), Conf.Connection["DB User"], Conf.Connection["DB Password"], Conf.Connection["DB Database"]);
            GodLesZ.Library.MySql.EMysqlConnectionError conRes = mDatabase.Prepare();
            if (conRes != GodLesZ.Library.MySql.EMysqlConnectionError.None)
            {
                ServerConsole.WriteLine(EConsoleColor.Error, " failed!");
                throw new Exception("Failed to open Database Connection! Type: " + conRes.ToString() + Environment.NewLine + (mDatabase.LastError != null ? ", Message: " + mDatabase.LastError.Message : ""));
            }
            watch.Stop();
            ServerConsole.WriteLine(EConsoleColor.Status, " done! Needed {0:F2} sec", watch.Elapsed.TotalSeconds);
            watch = null;

            // Load scripts (including events & that)
            ScriptDatabase.Initialize(@"Scripts\ScriptList.xml");

            ScriptCompiler.Compile(AppDomain.CurrentDomain.BaseDirectory + Path.Combine(Settings.Default.MainConfDir, Settings.Default.ScriptAssemblies), true, true);
            // Load assemblies for debug
            // TODO: we should load the assemblies for debugging
            //		 so VS could hijack them and we could debug them at runtime
            //		 also need the *.pdb files for this..

            // Packets handler
            PacketLoader.Initialize();

            // Initialize World events
            ScriptCompiler.Initialize("Rovolution.Server.Scripts");

            // Now we are able load our ressources
            World.Load();

            // Content init done, load Socket pool
            SocketPool.Create();
            mSocketConnector = new SocketConnector(mAppConf.Connection["Server IP"], mAppConf.Connection.GetInt("Server Port"));
            PacketHandlers.Initialize();

            // Start Timer Thread
            mTimerThread.Start();

            // Start timer for checking connections
            NetState.Initialize();


            // Initialize & load finished
            // Clean
            GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);


            // Trigger ServerStarted event
            Events.InvokeServerStarted();


            DateTime now, last = DateTime.Now;
            const int sampleInterval   = 100;
            const float ticksPerSecond = (float)(TimeSpan.TicksPerSecond * sampleInterval);
            int sample = 0;

            // The server loop
            // - looks for new sockets and process all packets
            while (mSignal.WaitOne())
            {
                // Refresh timer
                Timer.Slice();

                // Kick out old connections
                NetState.FlushAll();
                NetState.ProcessDisposedQueue();
                // Catch new connections
                mSocketConnector.Slice();

                if (Slice != null)
                {
                    Slice();
                }

                // just for Diagnostics
                if ((++sample % sampleInterval) == 0)
                {
                    now = DateTime.Now;
                    mCyclesPerSecond[mCycleIndex++ % mCyclesPerSecond.Length] = ticksPerSecond / (now.Ticks - last.Ticks);
                    last = now;
                }
            }
#if !DEBUG
        }

        catch (Exception e) {
            CurrentDomain_UnhandledException(null, new UnhandledExceptionEventArgs(e, true));
        }
#endif
        }
Example #20
0
        static void Main(string[] args)
        {
            Console.ForegroundColor = ConsoleColor.White;
            Console.Title           = "Leatty " + ServerConstants.Version;

            ServerConstants.LoadFromFile();

            InitializeDatabase();
            LoadDataBuffers();
            CustomNpcs = DataProvider.LoadCustomNpcs();
            StartCashShop();
            StartLogin();
            StartChannels();
            PingTimer.Elapsed += (sender, e) => PingClients();


            StartDataApi();

            GC.Collect();
            string line = string.Empty;

            while (!(line = Console.ReadLine().ToLower()).Contains("stop") && !line.Contains("exit"))
            {
                string[] split = line.Split(' ');
                if (split.Length > 0)
                {
                    switch (split[0])
                    {
                    case "login":
                        if (ServerConstants.LocalHost && Program.Clients.Any())
                        {
                            MapleClient  c   = Program.Clients.First().Value;
                            MapleAccount acc = MapleAccount.GetAccountFromDatabase("Nuclear");
                            c.SendPacket(LoginAccountHandler.LoginAccountSuccess(acc));
                        }
                        break;

                    case "mapleshark":
                    case "maplesharkconfig":
                        MapleSharkConfigCreator.GenerateConfigFile();
                        break;

                    case "dumpskills":
                        Functions.DumpSkillConstants();
                        break;

                    case "dumpitems":
                        Functions.DumpItems();
                        break;

                    case "send":
                        if (split.Length > 4)
                        {
                            MapleCharacter chr = GetCharacterByName(split[1]);
                            if (chr == null)
                            {
                                ServerConsole.Info("Player " + split[1] + "not found");
                            }
                            else
                            {
                                PacketWriter pw = new PacketWriter();
                                pw.WriteHexString(split.Fuse(2));
                                chr.Client.SendPacket(pw);
                            }
                        }
                        break;

                    case "notice":
                        if (split.Length > 1)
                        {
                            string message = "[Notice] " + split.Fuse(1);
                            BroadCastWorldPacket(MapleCharacter.ServerNotice(message, 6));
                        }
                        break;

                    default:
                        ServerConsole.Info("Unknown command: " + line);
                        break;
                    }
                }
            }
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine("Shutting down...");
            Quit();
        }
Example #21
0
        public static void Load()
        {
            if (Loaded == true || Loading == true)
            {
                return;
            }

            Loading = true;
            // Trigger events for scripts
            Events.Call("worldLoadStart");

            // Our object manager for world objects (spawned objects)
            Objects = new WorldObjectManager();

            // Delegate for Send() Method
            //mForeachInRangeCallback = new ForeachInRangeVoidDelegate(SendSub);

            mAddQueue = new Queue <WorldObject>();
            mDelQueue = new Queue <WorldObject>();

            // Load globals from config, initialize packets ect
            ServerConsole.InfoLine("Initialize game symantics...");
            Global.Initialize();
            PathHelper.Initialize();

            // Real database loading
            ServerConsole.InfoLine("Begin World loading...");

            DataTable table    = null;
            Stopwatch watchAll = Stopwatch.StartNew();
            Stopwatch watch    = Stopwatch.StartNew();

            //------------- loading start -------------

            #region Mapcache
            ServerConsole.Info("\t# loading Maps from mapcache...");
            watch.Reset();
            watch.Start();
            Mapcache.Initialize();
            watch.Stop();
            ServerConsole.WriteLine(EConsoleColor.Status, " done (" + Mapcache.Maps.Count + " Maps in " + watch.ElapsedMilliseconds + "ms)");
            #endregion


            // Loading other shit
            // o.o

            //------------- loading end -------------

            // Trigger event for scripts
            Events.Call("worldLoadFinish");

            Loading = false;
            Loaded  = true;

            ProcessSafetyQueues();

            // TODO: Initialize save timer

            ServerConsole.InfoLine("Finished World loading! Needed {0:F2} sec", watchAll.Elapsed.TotalSeconds);

            watch.Stop();
            watch = null;
            watchAll.Stop();
            watchAll = null;
        }
Example #22
0
        public static void Handle(MapleClient c, PacketReader pr)
        {
            int    tickCount = pr.ReadInt();
            string message   = pr.ReadMapleString();
            byte   show      = pr.ReadByte();

            ServerConsole.Info(c.Account.Character.Name + ": " + message);

            if (message[0] == '@')
            {
                if (PlayerCommands.ProcessCommand(message.Substring(1).Split(' '), c))
                {
                    return;
                }
            }
            else if (message[0] == '!')
            {
                if (c.Account.IsGM)
                {
                    string[] split = message.Substring(1).Split(' ');
                    if (GMCommands.ProcessCommand(split, c))
                    {
                        return;
                    }
                    if (c.Account.IsAdmin)
                    {
                        if (AdminCommands.ProcessCommand(split, c))
                        {
                            return;
                        }
                        else
                        {
                            c.Account.Character.SendBlueMessage("Unrecognized Admin command");
                            return;
                        }
                    }
                    else
                    {
                        c.Account.Character.SendBlueMessage("Unrecognized GM command");
                        return;
                    }
                }
            }
            else if (message[0] == '#')
            {
                if (c.Account.IsGM || c.Account.IsDonor)
                {
                    string[] split = message.Substring(1).Split(' ');
                    if (DonorCommands.ProcessCommand(split, c))
                    {
                        return;
                    }
                    else
                    {
                        c.Account.Character.SendBlueMessage("Unrecognized Donor command");
                        return;
                    }
                }
            }

            PacketWriter packet = PlayerChatPacket(c.Account.Character.Id, message, show, c.Account.IsGM);

            c.Account.Character.Map.BroadcastPacket(packet);
        }
Example #23
0
        public static void Main(string[] args)
        {
            // Try access a config
            var serverConfiguration = Factory.Create <Provider>("conf/server.xml");
            var dynamicConfig       = serverConfiguration.FirstAsExpando().configuration;

            // Prepare console for a large output
#if WINDOWS
            var width = Math.Min(100, Console.LargestWindowWidth - 2);
            Console.CursorVisible = false;
            Console.Clear();
            Console.WindowLeft = Console.WindowTop = 0;
            if (Console.WindowWidth < width)
            {
                Console.WindowWidth = width;
            }
#endif

            var ver = Assembly.GetExecutingAssembly().GetName().Version;
            Console.Title = string.Format("Zeus auth-server v{0}.{1}", ver.Major, ver.Minor);

            ServerConsole.StatusLine(Console.Title);

            // Create inter-server listener service
            string interServerEndPointAddress = string.Format("tcp://{0}:{1}", dynamicConfig.network.inter_server.host, dynamicConfig.network.inter_server.port);
            var    interServerEndPoint        = ProtocolEndPointBase.CreateEndPoint(interServerEndPointAddress);

            ServerConsole.Info("Start connecting to inter-server..");
            // @TODO: Is any action coming from inter-server to auth-server?
            // @TODO: Create inter -> auth service (character goes back to char select)
            _interClient            = ServiceClientBuilder.CreateClient <IAuthService>(interServerEndPoint, new ServerServiceImplementation());
            _interClient.Connected += (o, a) => {
                ServerConsole.WriteLine(ServerConsoleColor.Status, " successfull!");
                // AuthServerLogin
                _interClient.ServiceProxy.AuthServerLogin((string)dynamicConfig.network.inter_server.password);
            };
            _interClient.Disconnected += delegate {
                ServerConsole.ErrorLine("Connection to inter-server lost.");
                // @TODO: Reconnect?
            };
            _interClient.ConnectTimeout = 30;
            _interClient.Connect();

            // Create a client listener service
            string endPointAddress = string.Format("tcp://{0}:{1}", dynamicConfig.network.host, dynamicConfig.network.port);
            _clientService = ServiceBuilder.CreateService(ProtocolEndPointBase.CreateEndPoint(endPointAddress));
            _clientService.ClientConnected    += (sender, clientEventArgs) => ServerConsole.DebugLine("Client connected #{0}", clientEventArgs.Client.ClientId);
            _clientService.ClientDisconnected += (sender, clientEventArgs) => ServerConsole.DebugLine("Client disconnected #{0}", clientEventArgs.Client.ClientId);
            // Add interface for client connections
            var clientService = new ClientServiceImplementation(_interClient.ServiceProxy);
            _clientService.AddService <IClientService, ClientServiceImplementation>(clientService);
            // Start listener service
            _clientService.Start();

            ServerConsole.StatusLine("Auth-server is listening to: {0}", endPointAddress);

            do
            {
                var cmd = Console.ReadLine();
                if (cmd == "exit")
                {
                    _clientService.Stop();
                }
            } while (_clientService.Connected);

            ServerConsole.WarningLine("Press any key to exit.");
            Console.Read();
        }