diff --git a/Horse Isle Server/Horse Isle Server/Client.cs b/Horse Isle Server/Horse Isle Server/Client.cs index 68460f4..70f9043 100644 --- a/Horse Isle Server/Horse Isle Server/Client.cs +++ b/Horse Isle Server/Horse Isle Server/Client.cs @@ -76,19 +76,28 @@ namespace Horse_Isle_Server } byte identifier = Packet[0]; - if(!LoggedIn) // Must be either login or policy-file-request + if (!LoggedIn) // Must be either login or policy-file-request { - if(Encoding.UTF8.GetString(Packet).StartsWith("")) // Policy File Request + if (Encoding.UTF8.GetString(Packet).StartsWith("")) // Policy File Request { Server.OnCrossdomainPolicyRequest(this); } - switch(identifier) + switch (identifier) { case PacketBuilder.PACKET_LOGIN: - Server.OnLoginRequest(this,Packet); + Server.OnLoginRequest(this, Packet); break; } - } + } + else + { + switch (identifier) + { + case PacketBuilder.PACKET_LOGIN: + Server.OnUserInfoRequest(this, Packet); + break; + } + } } public void Disconnect() diff --git a/Horse Isle Server/Horse Isle Server/Database.cs b/Horse Isle Server/Horse Isle Server/Database.cs index 650d547..b8fb96f 100644 --- a/Horse Isle Server/Horse Isle Server/Database.cs +++ b/Horse Isle Server/Horse Isle Server/Database.cs @@ -17,6 +17,7 @@ namespace Horse_Isle_Server string ExtTable = "CREATE TABLE UserExt(Id INT, X INT, Y INT, Money INT, BankBalance BIGINT,ProfilePage Text(1028), CharId INT)"; string MailTable = "CREATE TABLE Mailbox(IdTo INT, PlayerFrom TEXT(16),Subject TEXT(128), Message Text(1028), TimeSent INT)"; string WorldTable = "CREATE TABLE World(TimeStarted INT, Weather TEXT(64))"; + string DroppedTable = "CREATE TABLE DroppedItems(X INT, Y INT, ItemID INT)"; try { @@ -31,7 +32,6 @@ namespace Horse_Isle_Server try { - MySqlCommand sqlCommand = db.CreateCommand(); sqlCommand.CommandText = ExtTable; sqlCommand.ExecuteNonQuery(); @@ -53,6 +53,18 @@ namespace Horse_Isle_Server Logger.WarnPrint(e.Message); }; + try + { + + MySqlCommand sqlCommand = db.CreateCommand(); + sqlCommand.CommandText = DroppedTable; + sqlCommand.ExecuteNonQuery(); + } + catch (Exception e) + { + Logger.WarnPrint(e.Message); + }; + try { diff --git a/Horse Isle Server/Horse Isle Server/Gamedata.cs b/Horse Isle Server/Horse Isle Server/Gamedata.cs index cc55315..6f6ede9 100644 --- a/Horse Isle Server/Horse Isle Server/Gamedata.cs +++ b/Horse Isle Server/Horse Isle Server/Gamedata.cs @@ -5,32 +5,19 @@ using Newtonsoft.Json; namespace Horse_Isle_Server { - internal class Isle - { - public int StartX = 0; - public int EndX = 0; - public int StartY = 0; - public int EndY = 0; - public int Tileset = 0; - public string Name; - public Isle(int startx, int starty, int endx, int endy, int tileset, string name) - { - StartX = startx; - StartY = starty; - EndX = endx; - EndY = endy; - Tileset = tileset; - Name = name; - } - } + class Gamedata { - public static List Isles = new List(); + public static string TileFlags; public static int NewUserStartX; public static int NewUserStartY; + // Messages public static string NewUserMessage; + public static string AreaMessage; + public static string NothingMessage; + public static string LoginMessage; public static void ReadGamedata() { @@ -46,25 +33,27 @@ namespace Horse_Isle_Server for(int i = 0; i < totalIsles; i++) { - int startx = gameData.isles[i].start_x; - int starty = gameData.isles[i].start_y; - int endx = gameData.isles[i].end_x; - int endy = gameData.isles[i].end_y; - int tileset = gameData.isles[i].tileset; - string name = gameData.isles[i].name; + World.Isle isle = new World.Isle(); + isle.StartX = gameData.isles[i].start_x; + isle.StartY = gameData.isles[i].start_y; + isle.EndX = gameData.isles[i].end_x; + isle.EndY = gameData.isles[i].end_y; + isle.Tileset = gameData.isles[i].tileset; + isle.Name = gameData.isles[i].name; - Logger.DebugPrint("Registered Isle: " + name + " X " + startx + "-" + endx + " Y " + starty + "-" + endy + " tileset: " + tileset); - Isles.Add(new Isle(startx, starty, endx, endy, tileset, name)); + Logger.DebugPrint("Registered Isle: " + isle.Name + " X " + isle.StartX + "-" + isle.EndX + " Y " + isle.StartY + "-" + isle.EndY + " tileset: " + isle.Tileset); + World.Isles.Add(isle); } NewUserMessage = gameData.new_user.starting_message; - Logger.DebugPrint("New User Message: " + NewUserMessage); NewUserStartX = gameData.new_user.starting_x; - Logger.DebugPrint("New User Start X: " + NewUserStartX); NewUserStartY = gameData.new_user.starting_y; - Logger.DebugPrint("New User Start Y: " + NewUserStartY); + LoginMessage = gameData.messages.login_format; + AreaMessage = gameData.messages.area_format; + NothingMessage = gameData.messages.nothing_message; + TileFlags = gameData.map_flags; } } diff --git a/Horse Isle Server/Horse Isle Server/Horse Isle Server.csproj b/Horse Isle Server/Horse Isle Server/Horse Isle Server.csproj index 09619eb..c216cd4 100644 --- a/Horse Isle Server/Horse Isle Server/Horse Isle Server.csproj +++ b/Horse Isle Server/Horse Isle Server/Horse Isle Server.csproj @@ -78,7 +78,9 @@ + + diff --git a/Horse Isle Server/Horse Isle Server/Map.cs b/Horse Isle Server/Horse Isle Server/Map.cs index 8efadaf..f1c2a59 100644 --- a/Horse Isle Server/Horse Isle Server/Map.cs +++ b/Horse Isle Server/Horse Isle Server/Map.cs @@ -17,10 +17,10 @@ namespace Horse_Isle_Server if ((x > MapData.Width || x < 0) || (y > MapData.Height || y < 0)) // Outside map? return 0x01; - if(overlay) - return oMapData.GetPixel(x,y).ToArgb() & Convert.ToInt32(0xFF000000); + if (overlay) + return oMapData.GetPixel(x, y).B; else - return MapData.GetPixel(x, y).ToArgb() & Convert.ToInt32(0xFF000000); + return MapData.GetPixel(x, y).B; } public static void OpenMap() @@ -32,7 +32,7 @@ namespace Horse_Isle_Server } MapData = new Bitmap(ConfigReader.MapFile); - oMapData = new Bitmap(ConfigReader.MapFile); + oMapData = new Bitmap(ConfigReader.OverlayMapFile); } } } diff --git a/Horse Isle Server/Horse Isle Server/PacketBuilder.cs b/Horse Isle Server/Horse Isle Server/PacketBuilder.cs index 2c2f6c6..101cc8c 100644 --- a/Horse Isle Server/Horse Isle Server/PacketBuilder.cs +++ b/Horse Isle Server/Horse Isle Server/PacketBuilder.cs @@ -20,6 +20,11 @@ namespace Horse_Isle_Server public const byte PACKET_USERINFO = 0x81; public const byte PACKET_WORLD = 0x7A; public const byte PACKET_BASE_STATS = 0x7B; + public const byte PACKET_PLACE_INFO = 0x1E; + public const byte PACKET_AREA_DEFS = 0x79; + public const byte PACKET_TILE_FLAGS = 0x75; + public const byte AREA_SEPERATOR = 0x5E; + private const byte CHAT_BOTTOM_LEFT = 0x14; private const byte CHAT_BOTTOM_RIGHT = 0x15; @@ -71,14 +76,19 @@ namespace Horse_Isle_Server direction -= 20; } + int ystart = y - 3; + + int xstart = x - 2; + + if (direction == 4) { - for(int rely = y - 3; rely < rely + 9; rely++) + for(int rely = 0; rely <= 9; rely++) { - for (int relx = x - 2; relx < relx + 12; relx++) + for (int relx = 0; relx <= 12; relx++) { - int tileId = Map.GetTileId(relx, rely, false); - int otileId = Map.GetTileId(relx, rely, true); + int tileId = Map.GetTileId(xstart + relx, ystart + rely, false); + int otileId = Map.GetTileId(xstart + relx, ystart + rely, true); if (tileId == 290) tileId -= 100; @@ -94,6 +104,24 @@ namespace Horse_Isle_Server ms.WriteByte(PACKET_TERMINATOR); + ms.Seek(0x00, SeekOrigin.Begin); + byte[] Packet = ms.ToArray(); + ms.Dispose(); + return Packet; + } + + public static byte[] CreatePlaceInfo(string formattedText) + { + byte[] strBytes = Encoding.UTF8.GetBytes(formattedText); + + MemoryStream ms = new MemoryStream(); + + ms.WriteByte(PACKET_PLACE_INFO); + + ms.Write(strBytes, 0x00, strBytes.Length); + + ms.WriteByte(PACKET_TERMINATOR); + ms.Seek(0x00, SeekOrigin.Begin); byte[] Packet = ms.ToArray(); ms.Dispose(); @@ -120,10 +148,14 @@ namespace Horse_Isle_Server return Packet; } + public static byte[] CreateAreaMessage(int x, int y) + { + string locationStr = Messages.LocationData(x, y); + return CreatePlaceInfo(locationStr); + } public static byte[] CreateLoginMessage(string username) { - string formattedStr = Gamedata.NewUserMessage.Replace("%USERNAME%", username); - + string formattedStr = Messages.LoginMessage(username); return CreateChat(formattedStr,CHAT_BOTTOM_RIGHT); } @@ -153,6 +185,41 @@ namespace Horse_Isle_Server return Packet; } + public static byte[] CreateIsleData(World.Isle[] isles) + { + MemoryStream ms = new MemoryStream(); + ms.WriteByte(PACKET_AREA_DEFS); + foreach(World.Isle isle in isles) + { + byte[] strBytes = Encoding.UTF8.GetBytes(isle.Name); + + ms.WriteByte(AREA_SEPERATOR); + + ms.WriteByte((byte)((isle.StartX / 64) + 20)); + ms.WriteByte((byte)((isle.StartX % 64) + 20)); + + ms.WriteByte((byte)((isle.EndX / 64) + 20)); + ms.WriteByte((byte)((isle.EndX % 64) + 20)); + + ms.WriteByte((byte)((isle.StartY / 64) + 20)); + ms.WriteByte((byte)((isle.StartY % 64) + 20)); + + ms.WriteByte((byte)((isle.EndY / 64) + 20)); + ms.WriteByte((byte)((isle.EndY % 64) + 20)); + + ms.WriteByte((byte)isle.Tileset.ToString()[0]); + + ms.Write(strBytes, 0x00, strBytes.Length); + } + ms.WriteByte(PACKET_TERMINATOR); + + ms.Seek(0x00, SeekOrigin.Begin); + byte[] Packet = ms.ToArray(); + ms.Dispose(); + + return Packet; + } + public static byte[] CreateBaseStats(int money, int playerCount, int mail) { byte[] moneyStrBytes = Encoding.UTF8.GetBytes(money.ToString()); @@ -175,6 +242,23 @@ namespace Horse_Isle_Server return Packet; } + + public static byte[] CreateTileFlags(string tileFlags) + { + MemoryStream ms = new MemoryStream(); + ms.WriteByte(PACKET_TILE_FLAGS); + + byte[] strBytes = Encoding.UTF8.GetBytes(tileFlags); + ms.Write(strBytes, 0x00, strBytes.Length); + + ms.WriteByte(PACKET_TERMINATOR); + + ms.Seek(0x00, SeekOrigin.Begin); + byte[] Packet = ms.ToArray(); + ms.Dispose(); + + return Packet; + } public static byte[] CreateSecCode(byte[] SecCodeSeed, int SecCodeInc, bool Admin, bool Moderator) { MemoryStream ms = new MemoryStream(); @@ -219,15 +303,23 @@ namespace Horse_Isle_Server timestamp += time.minutes; byte[] WorldData = CreateWorldData(timestamp, time.days, time.year, World.GetWeather()); - ms.Write(WorldData, 0x00, LoginMessage.Length); + ms.Write(WorldData, 0x00, WorldData.Length); byte[] SecCodePacket = CreateSecCode(user.SecCodeSeeds, user.SecCodeInc, user.Administrator, user.Moderator); ms.Write(SecCodePacket, 0x00, SecCodePacket.Length); byte[] BaseStatsPacketData = CreateBaseStats(user.Money, Server.GetNumberOfPlayers(), user.MailBox.MailCount); ms.Write(BaseStatsPacketData, 0x00, BaseStatsPacketData.Length); - + byte[] AreaMessage = CreateAreaMessage(user.X,user.Y); + ms.Write(AreaMessage, 0x00, AreaMessage.Length); + + byte[] IsleData = CreateIsleData(World.Isles.ToArray()); + ms.Write(IsleData, 0x00, IsleData.Length); + + byte[] TileFlags = CreateTileFlags(Gamedata.TileFlags); + ms.Write(TileFlags, 0x00, TileFlags.Length); + ms.Seek(0x00, SeekOrigin.Begin); byte[] Packet = ms.ToArray(); ms.Dispose(); diff --git a/Horse Isle Server/Horse Isle Server/Server.cs b/Horse Isle Server/Horse Isle Server/Server.cs index 45b716e..6cbeeeb 100644 --- a/Horse Isle Server/Horse Isle Server/Server.cs +++ b/Horse Isle Server/Horse Isle Server/Server.cs @@ -23,6 +23,17 @@ namespace Horse_Isle_Server sender.SendPacket(crossDomainPolicyResponse); // Send to client. } + public static void OnUserInfoRequest(Client sender, byte[] packet) + { + if (!sender.LoggedIn) + { + Logger.ErrorPrint(sender.RemoteIp + " Requested user information when not logged in."); + return; + } + Logger.DebugPrint(sender.RemoteIp + " Requesting user information."); + byte[] userInfoPackets = PacketBuilder.CreateUserInfo(sender); + sender.SendPacket(userInfoPackets); + } public static void OnLoginRequest(Client sender, byte[] packet) { Logger.DebugPrint("Login request received from: " + sender.RemoteIp); @@ -66,14 +77,6 @@ namespace Horse_Isle_Server sender.SendPacket(ResponsePacket); } } - else - { - if(!sender.LoggedIn) - { - Logger.ErrorPrint(sender.RemoteIp + " Requested user information when not logged in."); - return; - } - } } diff --git a/Horse Isle Server/Horse Isle Server/World.cs b/Horse Isle Server/Horse Isle Server/World.cs index f585fc6..05cecdd 100644 --- a/Horse Isle Server/Horse Isle Server/World.cs +++ b/Horse Isle Server/Horse Isle Server/World.cs @@ -9,7 +9,16 @@ namespace Horse_Isle_Server class World { - + public struct Isle + { + public int StartX; + public int EndX; + public int StartY; + public int EndY; + public int Tileset; + public string Name; + } + public struct Time { public int minutes; @@ -19,6 +28,7 @@ namespace Horse_Isle_Server } public const int MINUTE = 4320; + public static List Isles = new List(); public static Time GetGameTime() { int epoch = Database.GetServerCreationTime(); @@ -44,6 +54,22 @@ namespace Horse_Isle_Server return time; } + public static Isle GetIsle(int x, int y) + { + foreach(Isle isle in Isles) + { + + if (isle.StartX <= x && isle.EndX >= x && isle.StartY <= y && isle.EndY >= y) + { + return isle; + } + } + throw new KeyNotFoundException("x,y not in an isle!"); + } + public static int[] GetDroppedItems(int x, int y) + { + return new int[] { }; // Not implemented yet. + } public static string GetWeather() { return Database.GetWorldWeather(); diff --git a/WebInterface/game-site/map750.png b/WebInterface/game-site/map750.png new file mode 100644 index 0000000..4df3468 Binary files /dev/null and b/WebInterface/game-site/map750.png differ