From 862375cc756afcdf0b9203d03f57c1e0f2992f3a Mon Sep 17 00:00:00 2001 From: SilicaAndPina Date: Mon, 21 Dec 2020 16:09:05 +1300 Subject: [PATCH] Implement click packet --- DataCollection/gamedata.json | 1 + .../Horse Isle Server/Game/Messages.cs | 3 + .../Horse Isle Server/Game/Quest.cs | 2 +- .../Horse Isle Server/Player/User.cs | 11 ++ .../Horse Isle Server/Program.cs | 2 +- .../Horse Isle Server/Server/ConfigReader.cs | 3 +- .../Horse Isle Server/Server/GameDataJson.cs | 6 +- .../Horse Isle Server/Server/GameServer.cs | 162 +++++++++++------- .../Horse Isle Server/Server/Logger.cs | 3 + .../Horse Isle Server/Server/PacketBuilder.cs | 18 +- 10 files changed, 140 insertions(+), 71 deletions(-) diff --git a/DataCollection/gamedata.json b/DataCollection/gamedata.json index c35333c..1eb7c31 100644 --- a/DataCollection/gamedata.json +++ b/DataCollection/gamedata.json @@ -8,6 +8,7 @@ "profile_save":"Your profile changes were saved.", "buddy_request":"Attempting to Add Buddy. The other player must click ADD BUDDY as well. (Many players reserve this for just a couple players so don't feel insulted if they do not).", "drawing_notice":"Drawing not sent to other players when you are not a subscriber.", + "click_nothing_message":"Nothing interesting here...", "sec_code":{ "invalid_sec_code":"Data Code Error. You did not get the bonus. You should reconnect if you get this message again.", "item_earned":"You Earned a %ITEM%!" diff --git a/Horse Isle Server/Horse Isle Server/Game/Messages.cs b/Horse Isle Server/Horse Isle Server/Game/Messages.cs index 40e5e0f..2241aee 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Messages.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Messages.cs @@ -152,6 +152,9 @@ namespace HISP.Game public static string WagonCutscene; public static string BallonCutscene; + // Click + public static string NothingInterestingHere; + public static string FormatYouEarnedAnItemMessage(string itemName) { return YouEarnedAnItemFormat.Replace("%ITEM%", itemName); diff --git a/Horse Isle Server/Horse Isle Server/Game/Quest.cs b/Horse Isle Server/Horse Isle Server/Game/Quest.cs index 7f2001e..6a22ab1 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Quest.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Quest.cs @@ -139,7 +139,7 @@ namespace HISP.Game } } if (quest.WarpX != 0 && quest.WarpY != 0) - GameServer.Teleport(user.LoggedinClient, quest.WarpX, quest.WarpY); + user.Teleport(quest.WarpX, quest.WarpY); // Give quest points user.QuestPoints += quest.QuestPointsEarned; diff --git a/Horse Isle Server/Horse Isle Server/Player/User.cs b/Horse Isle Server/Horse Isle Server/Player/User.cs index ec5f0ba..7fb655a 100644 --- a/Horse Isle Server/Horse Isle Server/Player/User.cs +++ b/Horse Isle Server/Horse Isle Server/Player/User.cs @@ -152,6 +152,17 @@ namespace HISP.Player public int SecCodeInc = 0; public int SecCodeCount = 0; + public void Teleport(int newX, int newY) + { + Logger.DebugPrint("Teleporting: " + Username + " to: " + newX.ToString() + "," + newY.ToString()); + + X = newX; + Y = newY; + + byte[] MovementPacket = PacketBuilder.CreateMovementPacket(X, Y, CharacterId, Facing, PacketBuilder.DIRECTION_TELEPORT, true); + LoggedinClient.SendPacket(MovementPacket); + GameServer.Update(LoggedinClient); + } public byte[] GenerateSecCode() { var i = 0; diff --git a/Horse Isle Server/Horse Isle Server/Program.cs b/Horse Isle Server/Horse Isle Server/Program.cs index 37e9f10..7ccf3d3 100644 --- a/Horse Isle Server/Horse Isle Server/Program.cs +++ b/Horse Isle Server/Horse Isle Server/Program.cs @@ -17,8 +17,8 @@ namespace HISP ConfigReader.OpenConfig(); CrossDomainPolicy.GetPolicy(); Database.OpenDatabase(); - Map.OpenMap(); GameDataJson.ReadGamedata(); + Map.OpenMap(); World.ReadWorldData(); DroppedItems.Init(); GameServer.StartServer(); diff --git a/Horse Isle Server/Horse Isle Server/Server/ConfigReader.cs b/Horse Isle Server/Horse Isle Server/Server/ConfigReader.cs index b0e79ea..2fda49f 100644 --- a/Horse Isle Server/Horse Isle Server/Server/ConfigReader.cs +++ b/Horse Isle Server/Horse Isle Server/Server/ConfigReader.cs @@ -31,8 +31,9 @@ namespace HISP.Server { if (!File.Exists(ConfigurationFileName)) { - Logger.ErrorPrint(ConfigurationFileName+" not found! writing default."); + Logger.WarnPrint(ConfigurationFileName+" not found! writing default."); File.WriteAllText(ConfigurationFileName,Resources.DefaultServerProperties); + Logger.InfoPrint("! Its very likely database connection will fail..."); } string[] configFile = File.ReadAllLines(ConfigurationFileName); diff --git a/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs b/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs index 1ccd6e6..e57a8d7 100644 --- a/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs +++ b/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs @@ -13,7 +13,7 @@ namespace HISP.Server if(!File.Exists(ConfigReader.GameDataFile)) { Logger.ErrorPrint("Game Data JSON File: " + ConfigReader.GameDataFile + " Does not exist!"); - return; + throw new FileNotFoundException(ConfigReader.GameDataFile + " Not found :("); } string jsonData = File.ReadAllText(ConfigReader.GameDataFile); dynamic gameData = JsonConvert.DeserializeObject(jsonData); @@ -554,7 +554,9 @@ namespace HISP.Server // Inventory Messages.DefaultInventoryMax = gameData.item.max_carryable; - + + // Click + Messages.NothingInterestingHere = gameData.messages.click_nothing_message; // Swf Messages.WagonCutscene = gameData.transport.wagon_cutscene; diff --git a/Horse Isle Server/Horse Isle Server/Server/GameServer.cs b/Horse Isle Server/Horse Isle Server/Server/GameServer.cs index 266d0c2..c719831 100644 --- a/Horse Isle Server/Horse Isle Server/Server/GameServer.cs +++ b/Horse Isle Server/Horse Isle Server/Server/GameServer.cs @@ -33,6 +33,12 @@ namespace HISP.Server private static int gameTickSpeed = 4320; // Changing this to ANYTHING else will cause desync with the client. private static List connectedClients = new List(); + + /* + * This section is where all the event handlers live, + * eg: OnMovementPacket is whenever the server receies a movement request from the client. + */ + public static void OnCrossdomainPolicyRequest(GameClient sender) // When a cross-domain-policy request is received. { Logger.DebugPrint("Cross-Domain-Policy request received from: " + sender.RemoteIp); @@ -41,7 +47,6 @@ namespace HISP.Server sender.SendPacket(crossDomainPolicyResponse); // Send to client. } - public static void OnUserInfoRequest(GameClient sender, byte[] packet) { if (!sender.LoggedIn) @@ -97,7 +102,6 @@ namespace HISP.Server } - public static void OnKeepAlive(GameClient sender, byte[] packet) { if (!sender.LoggedIn) @@ -254,7 +258,6 @@ namespace HISP.Server } - public static void OnMovementPacket(GameClient sender, byte[] packet) { if (!sender.LoggedIn) @@ -380,7 +383,7 @@ namespace HISP.Server } else if(movementDirection == PacketBuilder.MOVE_UPDATE) { - Update(sender, true); + Update(sender); return; } @@ -452,7 +455,7 @@ namespace HISP.Server if (reply.GotoChatpoint == -1) { - UpdateArea(sender,true); + UpdateArea(sender); return; } sender.LoggedinUser.MetaPriority = true; @@ -515,7 +518,7 @@ namespace HISP.Server sender.SendPacket(swfModulePacket); } - Teleport(sender, transportLocation.GotoX, transportLocation.GotoY); + sender.LoggedinUser.Teleport(transportLocation.GotoX, transportLocation.GotoY); byte[] welcomeToIslePacket = PacketBuilder.CreateChat(Messages.FormatWelcomeToAreaMessage(transportLocation.LocationTitle), PacketBuilder.CHAT_BOTTOM_RIGHT); sender.SendPacket(welcomeToIslePacket); @@ -610,7 +613,52 @@ namespace HISP.Server // Send to sender sender.SendPacket(chatPacketSender); } + public static void OnClickPacket(GameClient sender, byte[] packet) + { + if (!sender.LoggedIn) + { + Logger.ErrorPrint(sender.RemoteIp + " Send click packet when not logged in."); + return; + } + if (packet.Length < 4) + { + Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid Click Packet"); + return; + } + + string packetStr = Encoding.UTF8.GetString(packet); + if(packetStr.Contains("|")) + { + string packetContents = packetStr.Substring(0, packetStr.Length - 3); + string[] xy = packetContents.Split('|'); + int x = 0; + int y = 0; + + try + { + x = int.Parse(xy[0]); + y = int.Parse(xy[1]); + } + catch(FormatException) + { + Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent a click packet with non-string xy value."); + return; + } + + // Get description of tile + string returnedMsg = Messages.NothingInterestingHere; + if(World.InSpecialTile(x, y)) + { + World.SpecialTile tile = World.GetSpecialTile(x, y); + if (tile.Title != null) + returnedMsg = tile.Title; + } + + byte[] tileInfoPacket = PacketBuilder.CreateClickTileInfoPacket(returnedMsg); + sender.SendPacket(tileInfoPacket); + } + } public static void OnItemInteraction(GameClient sender, byte[] packet) { if (!sender.LoggedIn) @@ -1031,7 +1079,6 @@ namespace HISP.Server } } - public static void OnInventoryRequested(GameClient sender, byte[] packet) { if (!sender.LoggedIn) @@ -1107,9 +1154,6 @@ namespace HISP.Server } } - - - public static void OnDisconnect(GameClient sender) { connectedClients.Remove(sender); @@ -1133,6 +1177,9 @@ namespace HISP.Server } + /* + * Get(Some Information) + */ public static User[] GetUsersUsersInIsle(World.Isle isle, bool includeStealth = false, bool includeMuted = false) { @@ -1151,7 +1198,6 @@ namespace HISP.Server return usersInIsle.ToArray(); } - public static User[] GetUsersAt(int x, int y, bool includeStealth = false, bool includeMuted = false) { List usersHere = new List(); @@ -1169,7 +1215,6 @@ namespace HISP.Server } return usersHere.ToArray(); } - public static User[] GetNearbyUsers(int x, int y, bool includeStealth=false, bool includeMuted=false) { int startX = x - 15; @@ -1191,7 +1236,6 @@ namespace HISP.Server return usersNearby.ToArray(); } - public static int GetNumberOfPlayers(bool includeStealth=false) { int count = 0; @@ -1206,7 +1250,6 @@ namespace HISP.Server return count; } - public static int GetNumberOfModsOnline() { int count = 0; @@ -1218,33 +1261,33 @@ namespace HISP.Server } return count; } - - public static void Teleport(GameClient client, int newX, int newY) + public static int GetNumberOfAdminsOnline() { - if (!client.LoggedIn) - return; - Logger.DebugPrint("Teleporting: " + client.LoggedinUser.Username + " to: " + newX.ToString() + "," + newY.ToString()); - - client.LoggedinUser.X = newX; - client.LoggedinUser.Y = newY; - - byte[] MovementPacket = PacketBuilder.CreateMovementPacket(client.LoggedinUser.X, client.LoggedinUser.Y, client.LoggedinUser.CharacterId, client.LoggedinUser.Facing, PacketBuilder.DIRECTION_TELEPORT, true); - client.SendPacket(MovementPacket); - Update(client); - + int count = 0; + foreach (GameClient client in ConnectedClients) + { + if (client.LoggedIn) + if (client.LoggedinUser.Administrator) + count++; + } + return count; } - public static void Update(GameClient client, bool justArea = false) + + /* + * Update game state functions. + */ + + public static void Update(GameClient client) { - UpdateArea(client, justArea); + UpdateArea(client); foreach (User nearbyUser in GameServer.GetNearbyUsers(client.LoggedinUser.X, client.LoggedinUser.Y, false, false)) if (nearbyUser.Id != client.LoggedinUser.Id) if(!nearbyUser.MetaPriority) - UpdateArea(nearbyUser.LoggedinClient, justArea); + UpdateArea(nearbyUser.LoggedinClient); UpdateUserInfo(client.LoggedinUser); } - public static void UpdateInventory(GameClient forClient) { if (!forClient.LoggedIn) @@ -1264,7 +1307,6 @@ namespace HISP.Server byte[] WorldData = PacketBuilder.CreateWorldData(World.ServerTime.Minutes, World.ServerTime.Days, World.ServerTime.Years, World.GetWeather()); forClient.SendPacket(WorldData); } - public static void UpdatePlayer(GameClient forClient) { if (!forClient.LoggedIn) @@ -1275,7 +1317,6 @@ namespace HISP.Server byte[] PlayerData = PacketBuilder.CreatePlayerData(forClient.LoggedinUser.Money, GameServer.GetNumberOfPlayers(), forClient.LoggedinUser.MailBox.MailCount); forClient.SendPacket(PlayerData); } - public static void UpdateUserInfo(User user) { byte[] playerInfoBytes = PacketBuilder.CreatePlayerInfoUpdateOrCreate(user.X, user.Y, user.Facing, user.CharacterId, user.Username); @@ -1292,17 +1333,16 @@ namespace HISP.Server } - public static void UpdateAreaForAll(int x, int y) { foreach(GameClient client in ConnectedClients) { if (client.LoggedIn) if (client.LoggedinUser.X == x && client.LoggedinUser.Y == y) - UpdateArea(client, true); + UpdateArea(client); } } - public static void UpdateArea(GameClient forClient, bool justArea = false) + public static void UpdateArea(GameClient forClient) { if (!forClient.LoggedIn) { @@ -1318,12 +1358,12 @@ namespace HISP.Server else { World.SpecialTile specialTile = World.GetSpecialTile(forClient.LoggedinUser.X, forClient.LoggedinUser.Y); - if (specialTile.AutoplaySwf != null && specialTile.AutoplaySwf != "" && !justArea) + if (specialTile.AutoplaySwf != null && specialTile.AutoplaySwf != "") { byte[] swfModulePacket = PacketBuilder.CreateSwfModulePacket(specialTile.AutoplaySwf,PacketBuilder.PACKET_SWF_MODULE_GENTLE); forClient.SendPacket(swfModulePacket); } - if (specialTile.Code != null && !justArea) + if (specialTile.Code != null) if (!ProcessMapCodeWithArg(forClient, specialTile.Code)) return; LocationStr = Meta.BuildSpecialTileInfo(forClient.LoggedinUser, specialTile); @@ -1334,6 +1374,9 @@ namespace HISP.Server } + /* + * Other... + */ public static bool ProcessMapCodeWithArg(GameClient forClient, string mapCode) { if(mapCode.Contains('-')) @@ -1351,7 +1394,7 @@ namespace HISP.Server { int newX = int.Parse(args[0]); int newY = int.Parse(args[1]); - Teleport(forClient, newX, newY); + forClient.LoggedinUser.Teleport(newX, newY); return false; } catch(Exception) @@ -1363,31 +1406,6 @@ namespace HISP.Server } return true; } - - - public static int GetNumberOfAdminsOnline() - { - int count = 0; - foreach (GameClient client in ConnectedClients) - { - if (client.LoggedIn) - if (client.LoggedinUser.Administrator) - count++; - } - return count; - } - - private static void onTick(object state) - { - World.TickWorldClock(); - - if(World.ServerTime.Minutes % 20 == 0) - { - DroppedItems.Update(); - } - } - - public static void StartServer() { ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); @@ -1408,5 +1426,21 @@ namespace HISP.Server connectedClients.Add(client); } } + + /* + * Private methods.. + */ + + private static void onTick(object state) + { + World.TickWorldClock(); + + if(World.ServerTime.Minutes % 20 == 0) + { + DroppedItems.Update(); + } + } + + } } diff --git a/Horse Isle Server/Horse Isle Server/Server/Logger.cs b/Horse Isle Server/Horse Isle Server/Server/Logger.cs index 61d83fb..081d9f5 100644 --- a/Horse Isle Server/Horse Isle Server/Server/Logger.cs +++ b/Horse Isle Server/Horse Isle Server/Server/Logger.cs @@ -6,7 +6,10 @@ namespace HISP.Server { public static void HackerPrint(string text) // When someone is obviously cheating. { + ConsoleColor prevColor = Console.ForegroundColor; + Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("[HACK] " + text); + Console.ForegroundColor = prevColor; } public static void DebugPrint(string text) { diff --git a/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs b/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs index e84c740..9fe1b5c 100644 --- a/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs +++ b/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs @@ -14,6 +14,7 @@ namespace HISP.Server public const byte PACKET_LOGIN = 0x7F; public const byte PACKET_CHAT = 0x14; public const byte PACKET_MOVE = 0x15; + public const byte PACKET_CLICK = 0x77; public const byte PACKET_USERINFO = 0x81; public const byte PACKET_WORLD = 0x7A; public const byte PACKET_BASE_STATS = 0x7B; @@ -354,6 +355,21 @@ namespace HISP.Server return Packet; } + public static byte[] CreateClickTileInfoPacket(string text) + { + byte[] strBytes = Encoding.UTF8.GetBytes(text); + MemoryStream ms = new MemoryStream(); + ms.WriteByte(PACKET_CLICK); + 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[] CreateMetaPacket(string formattedText) { byte[] strBytes = Encoding.UTF8.GetBytes(formattedText); @@ -361,9 +377,7 @@ namespace HISP.Server MemoryStream ms = new MemoryStream(); ms.WriteByte(PACKET_PLACE_INFO); - ms.Write(strBytes, 0x00, strBytes.Length); - ms.WriteByte(PACKET_TERMINATOR); ms.Seek(0x00, SeekOrigin.Begin);