static void Main(string[] args) { Console.Title = "HISP - Horse Isle Server Emulator"; ConfigReader.OpenConfig(); CrossDomainPolicy.GetPolicy(); Database.OpenDatabase(); GameDataJson.ReadGamedata(); Map.OpenMap(); World.ReadWorldData(); Treasure.Init(); DroppedItems.Init(); WildHorse.Init(); Drawingroom.LoadAllDrawingRooms(); Brickpoet.LoadPoetryRooms(); Multiroom.CreateMultirooms(); Auction.LoadAllAuctionRooms(); Item.DoSpecialCases(); GameServer.StartServer(); }
static void Main(string[] args) { #if (!DEBUG) AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); #endif Console.Title = ServerVersion.GetBuildString(); ConfigReader.OpenConfig(); CrossDomainPolicy.GetPolicy(); Database.OpenDatabase(); GameDataJson.ReadGamedata(); Map.OpenMap(); World.ReadWorldData(); Treasure.Init(); DroppedItems.Init(); WildHorse.Init(); Drawingroom.LoadAllDrawingRooms(); Brickpoet.LoadPoetryRooms(); Multiroom.CreateMultirooms(); Auction.LoadAllAuctionRooms(); Item.DoSpecialCases(); GameServer.StartServer(); while (true) { } ; }
private void ReceiveDataCallback(IAsyncResult ar) { if (ClientSocket == null || !ClientSocket.Connected || Disposing) { return; } try { var bytesReceived = ClientSocket.EndReceive(ar); if (bytesReceived == 0) { Logger.Info($"[{Username ?? "Anonymous"}] has disconnected from the server."); if (Username != null) { PlayerRoom.RemovePlayer(Username); } Disconnect(); return; } var packetBytes = new byte[bytesReceived]; Buffer.BlockCopy(SocketBuffer, 0, packetBytes, 0, bytesReceived); try { var packetString = Encoding.Default.GetString(packetBytes); var packetXml = XElement.Parse(packetString.Substring(0, packetString.Length - 1)); // TODO: Make sure entire packet is here /0 if (packetXml.Name.LocalName.Equals("policy-file-request")) { Logger.Debug("Received policy request"); ClientSocket.Send(Encoding.Default.GetBytes(CrossDomainPolicy.GetPolicy())); } else { PacketHandler.HandleIncomingMessage(new IncomingMessage(packetXml), this); } } catch (XmlException) { // ignored } } catch (Exception exception) { Logger.Error(exception, "Client generated an exception."); } finally { ReceiveData(); } }
// Client private void ClientListenerOnReceivedBytes(object sender, ListenerReceivedBytesEventArgs e) { Logger.Verbose($"ClientListenerOnReceivedBytes({e.Bytes.Length})"); var bytes = e.Bytes; // Policy if (bytes.Length == 23 && bytes[0] == 0x3c) { SendToClientAsync(CrossDomainPolicy.GetPolicyBytes()).GetAwaiter().GetResult(); } else { Client.Encryption.ServerRC4?.Parse(bytes); Client.PacketProcessor.ParseBytes(bytes); } }
private void ReceiveDataCallback(IAsyncResult ar) { if (ClientSocket == null || !ClientSocket.Connected || Disposing) { return; } try { var bytesReceived = ClientSocket.EndReceive(ar); if (bytesReceived == 0) { Logger.Info($"[{Username ?? "Anonymous"}] has disconnected from the server."); if (Username != null) { PlayerRoom.RemovePlayer(Username); } Disconnect(); return; } var packetBytes = new byte[bytesReceived]; Buffer.BlockCopy(SocketBuffer, 0, packetBytes, 0, bytesReceived); var packetString = Encoding.ASCII.GetString(packetBytes); packetString = packetString.Substring(0, packetString.Length - 1); // TODO: Make sure entire packet is here /0 packetString = Constants.PacketFix.Replace(packetString, match => // Fix packet starting with numbers { var replacement = Constants.PacketFixMap[match.Groups["number"].Value]; return($"<{replacement} "); }); try { var packetXml = XElement.Parse(packetString); if (packetXml.Name.LocalName.Equals("policy-file-request")) { Logger.Debug("Received policy request"); ClientSocket.Send(Encoding.ASCII.GetBytes(CrossDomainPolicy.GetPolicy())); } else { PacketHandler.HandleIncomingMessage(new IncomingMessage(packetXml), this); } } catch (XmlException exception) { Logger.Error(exception, $"[{Username ?? "Anonymous"}] Invalid xml was received: '{packetString}'."); } } catch (Exception exception) { Logger.Error(exception, $"[{Username ?? "Anonymous"}] Client generated an exception."); } finally { ReceiveData(); } }
/// <summary> /// Main Void, Initializes the Emulator. /// </summary> internal static void Initialize() { #region Precheck Console.Title = "CityRP está iniciando.."; ServerStarted = DateTime.Now; _defaultEncoding = Encoding.Default; #endregion Precheck #region Database Connection CultureInfo = CultureInfo.CreateSpecificCulture("en-GB"); try { ConfigurationData.Load(Path.Combine(Application.StartupPath, "Settings/main.ini"), false); RoleplayData.Load(Path.Combine(Application.StartupPath, "Settings/Roleplay/settings.ini"), true); DatabaseConnectionType = ConfigurationData.Data["db.type"]; var mySqlConnectionStringBuilder = new MySqlConnectionStringBuilder { Server = (ConfigurationData.Data["db.hostname"]), Port = (uint.Parse(ConfigurationData.Data["db.port"])), UserID = (ConfigurationData.Data["db.username"]), Password = (ConfigurationData.Data["db.password"]), Database = (ConfigurationData.Data["db.name"]), MinimumPoolSize = (uint.Parse(ConfigurationData.Data["db.pool.minsize"])), MaximumPoolSize = (uint.Parse(ConfigurationData.Data["db.pool.maxsize"])), Pooling = (true), AllowZeroDateTime = (true), ConvertZeroDateTime = (true), DefaultCommandTimeout = (300), ConnectionTimeout = (10) }; var mySqlConnectionStringBuilder2 = mySqlConnectionStringBuilder; Manager = new DatabaseManager(mySqlConnectionStringBuilder2.ToString(), DatabaseConnectionType); using (var queryReactor = GetDatabaseManager().GetQueryReactor()) { ConfigData = new ConfigData(queryReactor); PetCommandHandler.Init(queryReactor); PetLocale.Init(queryReactor); OfflineMessages = new Dictionary <uint, List <OfflineMessage> >(); OfflineMessage.InitOfflineMessages(queryReactor); } #endregion Database Connection #region Packets Registering ConsoleTimer = (int.Parse(ConfigurationData.Data["console.clear.time"])); ConsoleTimerOn = (bool.Parse(ConfigurationData.Data["console.clear.enabled"])); FriendRequestLimit = ((uint)int.Parse(ConfigurationData.Data["client.maxrequests"])); LibraryParser.Incoming = new Dictionary <int, LibraryParser.StaticRequestHandler>(); LibraryParser.Library = new Dictionary <string, string>(); LibraryParser.Outgoing = new Dictionary <string, int>(); LibraryParser.Config = new Dictionary <string, string>(); LibraryParser.RegisterLibrary(); LibraryParser.RegisterOutgoing(); LibraryParser.RegisterIncoming(); LibraryParser.RegisterConfig(); #endregion Packets Registering #region Game Initalizer ExtraSettings.RunExtraSettings(); CrossDomainPolicy.Set(); _game = new Game(int.Parse(ConfigurationData.Data["game.tcp.conlimit"])); _game.GetNavigator().LoadNewPublicRooms(); _game.ContinueLoading(); #endregion Game Initalizer #region Languages Parser ServerLanguage = (Convert.ToString(ConfigurationData.Data["system.lang"])); _languages = new Languages(ServerLanguage); #endregion Languages Parser #region Environment SetUp if (ConsoleTimerOn) { Out.WriteLine("Console Clear Timer is enable with " + ConsoleTimer + " seconds."); } _connectionManager = new ConnectionHandling(int.Parse(ConfigurationData.Data["game.tcp.port"]), int.Parse(ConfigurationData.Data["game.tcp.conlimit"]), int.Parse(ConfigurationData.Data["game.tcp.conperip"]), ConfigurationData.Data["game.tcp.enablenagles"].ToLower() == "true"); if (LibraryParser.Config["Crypto.Enabled"] == "true") { Handler.Initialize(LibraryParser.Config["Crypto.RSA.N"], LibraryParser.Config["Crypto.RSA.D"], LibraryParser.Config["Crypto.RSA.E"]); } _connectionManager.init(); LibraryParser.Initialize(); #endregion Environment SetUp #region Tasks and MusSystem if (ConsoleTimerOn) { Timer = new Timer { Interval = ConsoleTimer }; Timer.Elapsed += TimerElapsed; Timer.Start(); } if (ConfigurationData.Data.ContainsKey("StaffAlert.MinRank")) { StaffAlertMinRank = uint.Parse(ConfigurationData.Data["StaffAlert.MinRank"]); } if (ConfigurationData.Data.ContainsKey("SeparatedTasksInMainLoops.enabled") && ConfigurationData.Data["SeparatedTasksInMainLoops.enabled"] == "true") { SeparatedTasksInMainLoops = true; } if (ConfigurationData.Data.ContainsKey("SeparatedTasksInGameClientManager.enabled") && ConfigurationData.Data["SeparatedTasksInGameClientManager.enabled"] == "true") { SeparatedTasksInGameClientManager = true; } if (ConfigurationData.Data.ContainsKey("Debug")) { if (ConfigurationData.Data["Debug"] == "true") { DebugMode = true; } } TimeSpan TimeUsed = DateTime.Now - ServerStarted; Out.WriteLine("CityRP >> Started (" + TimeUsed.Seconds + "s, " + TimeUsed.Milliseconds + "ms)", "", ConsoleColor.Green); IsLive = true; using (var queryReactor = GetDatabaseManager().GetQueryReactor()) { queryReactor.RunFastQuery("UPDATE server_settings SET value = '1' WHERE variable = 'status'"); } } catch (Exception e) { Out.WriteLine("Error in main.ini: Configuration file is invalid" + Environment.NewLine + e.Message, "", ConsoleColor.Red); Out.WriteLine("Please press Y to get more details or press other Key to Exit", "", ConsoleColor.Red); var key = Console.ReadKey(); if (key.Key == ConsoleKey.Y) { Console.WriteLine(); Out.WriteLine( Environment.NewLine + "[Message] Error Details: " + Environment.NewLine + e.StackTrace + Environment.NewLine + e.InnerException + Environment.NewLine + e.TargetSite + Environment.NewLine + "[Message ]Press Any Key To Exit", "", ConsoleColor.Red); Console.ReadKey(); Environment.Exit(1); } else { Environment.Exit(1); } } #endregion Tasks and MusSystem }