From bf4d5f50052d5f18fd2e0ccc16cbb750d3acff31 Mon Sep 17 00:00:00 2001
From: Li
Date: Sun, 8 May 2022 12:21:33 +1200
Subject: [PATCH] add build script
---
HorseIsleServer/HISP.sln | 49 +-
.../HISPd/Resources/DEBIAN/control | 6 +-
HorseIsleServer/LibHISP/Game/Chat/Chat.cs | 976 +-
HorseIsleServer/LibHISP/Game/Chat/Command.cs | 2 -
HorseIsleServer/LibHISP/LibHISP.csproj | 2 +-
HorseIsleServer/LibHISP/LibHISP.csproj.user | 2 +-
HorseIsleServer/LibHISP/Modding/IMod.cs | 20 -
HorseIsleServer/LibHISP/Modding/ModLoader.cs | 77 -
HorseIsleServer/LibHISP/Server/Entry.cs | 144 +-
HorseIsleServer/LibHISP/Server/GameServer.cs | 16562 ++++++++--------
.../LibHISP/Server/ServerVersion.cs | 22 +-
HorseIsleServer/N00BS/N00BS.csproj.user | 2 +-
HorseIsleServer/N00BS/Program.cs | 2 -
HorseIsleServer/build.py | 41 +
14 files changed, 8903 insertions(+), 9004 deletions(-)
delete mode 100644 HorseIsleServer/LibHISP/Modding/IMod.cs
delete mode 100644 HorseIsleServer/LibHISP/Modding/ModLoader.cs
create mode 100644 HorseIsleServer/build.py
diff --git a/HorseIsleServer/HISP.sln b/HorseIsleServer/HISP.sln
index f53da30..4e1c463 100644
--- a/HorseIsleServer/HISP.sln
+++ b/HorseIsleServer/HISP.sln
@@ -38,11 +38,6 @@ Global
MacOS|ARM64 = MacOS|ARM64
MacOS|x64 = MacOS|x64
MacOS|x86 = MacOS|x86
- Release|Any CPU = Release|Any CPU
- Release|ARM = Release|ARM
- Release|ARM64 = Release|ARM64
- Release|x64 = Release|x64
- Release|x86 = Release|x86
Windows|Any CPU = Windows|Any CPU
Windows|ARM = Windows|ARM
Windows|ARM64 = Windows|ARM64
@@ -98,16 +93,6 @@ Global
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.MacOS|x64.Build.0 = MacOS|x64
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.MacOS|x86.ActiveCfg = MacOS|x86
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.MacOS|x86.Build.0 = MacOS|x86
- {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Release|Any CPU.ActiveCfg = Windows|Any CPU
- {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Release|Any CPU.Build.0 = Windows|Any CPU
- {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Release|ARM.ActiveCfg = Windows|ARM
- {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Release|ARM.Build.0 = Windows|ARM
- {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Release|ARM64.ActiveCfg = Windows|ARM64
- {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Release|ARM64.Build.0 = Windows|ARM64
- {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Release|x64.ActiveCfg = Windows|x64
- {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Release|x64.Build.0 = Windows|x64
- {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Release|x86.ActiveCfg = Debug|x86
- {C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Release|x86.Build.0 = Debug|x86
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Windows|Any CPU.ActiveCfg = Windows|x64
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Windows|Any CPU.Build.0 = Windows|x64
{C48CBD82-AB30-494A-8FFA-4DE7069B5827}.Windows|ARM.ActiveCfg = Windows|ARM
@@ -166,16 +151,6 @@ Global
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.MacOS|x64.Build.0 = MacOS|x64
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.MacOS|x86.ActiveCfg = MacOS|x86
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.MacOS|x86.Build.0 = MacOS|x86
- {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|Any CPU.ActiveCfg = Linux|Any CPU
- {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|Any CPU.Build.0 = Linux|Any CPU
- {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|ARM.ActiveCfg = Debug|ARM
- {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|ARM.Build.0 = Debug|ARM
- {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|ARM64.ActiveCfg = Debug|ARM64
- {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|ARM64.Build.0 = Debug|ARM64
- {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|x64.ActiveCfg = Windows|x64
- {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|x64.Build.0 = Windows|x64
- {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|x86.ActiveCfg = Debug|x86
- {DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Release|x86.Build.0 = Debug|x86
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Windows|Any CPU.ActiveCfg = Debug|x64
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Windows|Any CPU.Build.0 = Debug|x64
{DEAD5CB0-C6B6-4B63-B1FB-A9F649CA1D27}.Windows|ARM.ActiveCfg = Windows|Any CPU
@@ -216,16 +191,6 @@ Global
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.MacOS|ARM64.ActiveCfg = Debug|Any CPU
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.MacOS|x64.ActiveCfg = Debug|Any CPU
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.MacOS|x86.ActiveCfg = Debug|Any CPU
- {6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Release|Any CPU.ActiveCfg = Windows|Any CPU
- {6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Release|Any CPU.Build.0 = Windows|Any CPU
- {6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Release|ARM.ActiveCfg = Windows|Any CPU
- {6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Release|ARM.Build.0 = Windows|Any CPU
- {6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Release|ARM64.ActiveCfg = Windows|Any CPU
- {6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Release|ARM64.Build.0 = Windows|Any CPU
- {6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Release|x64.ActiveCfg = Debug|x64
- {6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Release|x64.Build.0 = Debug|x64
- {6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Release|x86.ActiveCfg = Debug|x86
- {6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Release|x86.Build.0 = Debug|x86
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Windows|Any CPU.ActiveCfg = Debug|x64
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Windows|Any CPU.Build.0 = Debug|x64
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Windows|ARM.ActiveCfg = Windows|Any CPU
@@ -234,7 +199,7 @@ Global
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Windows|x64.Build.0 = Windows|x64
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Windows|x86.ActiveCfg = Windows|x86
{6B45A1E8-0F54-4BF7-AF48-41B9FE676570}.Windows|x86.Build.0 = Windows|x86
- {D330A197-67D4-42B0-8906-54264AF95EC1}.Android|Any CPU.ActiveCfg = Debug
+ {D330A197-67D4-42B0-8906-54264AF95EC1}.Android|Any CPU.ActiveCfg = Windows
{D330A197-67D4-42B0-8906-54264AF95EC1}.Android|ARM.ActiveCfg = Windows
{D330A197-67D4-42B0-8906-54264AF95EC1}.Android|ARM64.ActiveCfg = Windows
{D330A197-67D4-42B0-8906-54264AF95EC1}.Android|x64.ActiveCfg = Windows
@@ -259,17 +224,7 @@ Global
{D330A197-67D4-42B0-8906-54264AF95EC1}.MacOS|ARM64.ActiveCfg = Debug
{D330A197-67D4-42B0-8906-54264AF95EC1}.MacOS|x64.ActiveCfg = Debug
{D330A197-67D4-42B0-8906-54264AF95EC1}.MacOS|x86.ActiveCfg = Debug
- {D330A197-67D4-42B0-8906-54264AF95EC1}.Release|Any CPU.ActiveCfg = Release
- {D330A197-67D4-42B0-8906-54264AF95EC1}.Release|Any CPU.Build.0 = Release
- {D330A197-67D4-42B0-8906-54264AF95EC1}.Release|ARM.ActiveCfg = Release
- {D330A197-67D4-42B0-8906-54264AF95EC1}.Release|ARM.Build.0 = Release
- {D330A197-67D4-42B0-8906-54264AF95EC1}.Release|ARM64.ActiveCfg = Release
- {D330A197-67D4-42B0-8906-54264AF95EC1}.Release|ARM64.Build.0 = Release
- {D330A197-67D4-42B0-8906-54264AF95EC1}.Release|x64.ActiveCfg = Release
- {D330A197-67D4-42B0-8906-54264AF95EC1}.Release|x64.Build.0 = Release
- {D330A197-67D4-42B0-8906-54264AF95EC1}.Release|x86.ActiveCfg = Release
- {D330A197-67D4-42B0-8906-54264AF95EC1}.Release|x86.Build.0 = Release
- {D330A197-67D4-42B0-8906-54264AF95EC1}.Windows|Any CPU.ActiveCfg = Debug
+ {D330A197-67D4-42B0-8906-54264AF95EC1}.Windows|Any CPU.ActiveCfg = Windows
{D330A197-67D4-42B0-8906-54264AF95EC1}.Windows|ARM.ActiveCfg = Windows
{D330A197-67D4-42B0-8906-54264AF95EC1}.Windows|ARM64.ActiveCfg = Release
{D330A197-67D4-42B0-8906-54264AF95EC1}.Windows|x64.ActiveCfg = Windows
diff --git a/HorseIsleServer/HISPd/Resources/DEBIAN/control b/HorseIsleServer/HISPd/Resources/DEBIAN/control
index af54ce9..36b28d3 100644
--- a/HorseIsleServer/HISPd/Resources/DEBIAN/control
+++ b/HorseIsleServer/HISPd/Resources/DEBIAN/control
@@ -1,7 +1,7 @@
Package: hisp
-Version: 1.6.2
-Depends: coreutils,systemd,mariadb-server,libsqlite3-dev
+Version: $VERSION
+Depends: coreutils,systemd,mariadb-server,libsqlite3-dev,zlib1g-dev,libicu-dev,libkrb5-dev
Maintainer: Li
Homepage: https://islehorse.com
Architecture: amd64
-Description: Open Source Implementation of the flash game "Horse Isle" server.
+Description: Open Source Implementation of the server for flash game "Horse Isle".
diff --git a/HorseIsleServer/LibHISP/Game/Chat/Chat.cs b/HorseIsleServer/LibHISP/Game/Chat/Chat.cs
index 59b81a1..72a8acb 100644
--- a/HorseIsleServer/LibHISP/Game/Chat/Chat.cs
+++ b/HorseIsleServer/LibHISP/Game/Chat/Chat.cs
@@ -1,94 +1,94 @@
-using System;
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
using System.Globalization;
-using System.Linq;
-
-using HISP.Player;
-using HISP.Server;
-
-namespace HISP.Game.Chat
-{
- public class Chat
- {
- public struct Correction
- {
- public string FilteredWord;
- public string ReplacedWord;
- }
-
- public struct Reason
- {
- public string Name;
- public string Message;
- }
- public struct Filter
- {
- public string FilteredWord;
- public Reason Reason;
- public bool MatchAll;
- }
-
-
- public enum ChatChannel
- {
- All = 0x14,
- Ads = 0x1D,
- Near = 0x15,
- Buddies = 0x17,
- Here = 0x18,
- Isle = 0x1A,
- Dm = 0x16,
- Mod = 0x1c,
- Admin = 0x1b
- }
- public static string PrivateMessageSound;
-
- private static List filteredWords = new List();
- private static List correctedWords = new List();
- private static List reasons = new List();
-
- public static void AddFilter(Filter filter)
- {
- filteredWords.Add(filter);
- }
- public static void AddCorrection(Correction correction)
- {
- correctedWords.Add(correction);
- }
- public static void AddReason(Reason reason)
- {
- reasons.Add(reason);
- }
- public static Filter[] FilteredWords
- {
- get
- {
- return filteredWords.ToArray();
- }
- }
- public static Correction[] CorrectedWords
- {
- get
- {
- return correctedWords.ToArray();
- }
- }
- public static Reason[] Reasons
- {
- get
- {
- return reasons.ToArray();
- }
- }
-
- public static bool ProcessCommand(User user, string message)
- {
- if (message.Length < 1)
+using System.Linq;
+
+using HISP.Player;
+using HISP.Server;
+
+namespace HISP.Game.Chat
+{
+ public class Chat
+ {
+ public struct Correction
+ {
+ public string FilteredWord;
+ public string ReplacedWord;
+ }
+
+ public struct Reason
+ {
+ public string Name;
+ public string Message;
+ }
+ public struct Filter
+ {
+ public string FilteredWord;
+ public Reason Reason;
+ public bool MatchAll;
+ }
+
+
+ public enum ChatChannel
+ {
+ All = 0x14,
+ Ads = 0x1D,
+ Near = 0x15,
+ Buddies = 0x17,
+ Here = 0x18,
+ Isle = 0x1A,
+ Dm = 0x16,
+ Mod = 0x1c,
+ Admin = 0x1b
+ }
+ public static string PrivateMessageSound;
+
+ private static List filteredWords = new List();
+ private static List correctedWords = new List();
+ private static List reasons = new List();
+
+ public static void AddFilter(Filter filter)
+ {
+ filteredWords.Add(filter);
+ }
+ public static void AddCorrection(Correction correction)
+ {
+ correctedWords.Add(correction);
+ }
+ public static void AddReason(Reason reason)
+ {
+ reasons.Add(reason);
+ }
+ public static Filter[] FilteredWords
+ {
+ get
+ {
+ return filteredWords.ToArray();
+ }
+ }
+ public static Correction[] CorrectedWords
+ {
+ get
+ {
+ return correctedWords.ToArray();
+ }
+ }
+ public static Reason[] Reasons
+ {
+ get
+ {
+ return reasons.ToArray();
+ }
+ }
+
+ public static bool ProcessCommand(User user, string message)
+ {
+ if (message.Length < 1)
return false;
string parsedMessage = message;
- parsedMessage = parsedMessage.Trim();
+ parsedMessage = parsedMessage.Trim();
char cLetter = parsedMessage[0];
parsedMessage = parsedMessage.Substring(1).Trim();
@@ -105,405 +105,405 @@ namespace HISP.Game.Chat
return cmd.CmdCallback(messageToGive, args, user);
}
}
- }
- return false;
- }
- public static Object FilterMessage(string message) // Handles chat filtering and violation stuffs
- {
- if (!ConfigReader.BadWords) // Freedom of Speech Mode
- return null;
-
-
- string[] wordsSaid;
- if (message.Contains(' '))
- wordsSaid = message.Split(' ');
- else
- wordsSaid = new string[] { message };
-
-
- foreach(Filter filter in FilteredWords)
- {
- if (!filter.MatchAll)
- {
- foreach (string word in wordsSaid)
- {
- if (word.ToLower() == filter.FilteredWord.ToLower())
- return filter.Reason;
- }
- }
- else
- {
- if (message.ToLower().Contains(filter.FilteredWord))
- return filter.Reason;
- }
- }
-
- return null;
- }
-
- public static byte GetSide(ChatChannel channel)
- {
- switch (channel)
- {
- case ChatChannel.All:
- case ChatChannel.Ads:
- case ChatChannel.Isle:
- return PacketBuilder.CHAT_BOTTOM_LEFT;
- case ChatChannel.Buddies:
- case ChatChannel.Here:
- case ChatChannel.Admin:
- case ChatChannel.Mod:
- return PacketBuilder.CHAT_BOTTOM_RIGHT;
- case ChatChannel.Dm:
- return PacketBuilder.CHAT_DM_RIGHT;
- default:
- Logger.ErrorPrint("unknown channel: " + (byte)channel);
- return PacketBuilder.CHAT_BOTTOM_LEFT;
- }
-
- }
-
- public static string GetDmRecipiant(string message)
- {
- if(message.Contains('|'))
- {
- string recipiantName = message.Split('|')[0];
- return recipiantName;
- }
- else
- {
- return null;
- }
- }
-
- public static string GetDmMessage(string message)
- {
- if (message.Contains('|'))
- {
- string messageStr = message.Split('|')[1];
- return messageStr;
- }
- else
- {
- return message;
- }
- }
-
- public static GameClient[] GetRecipiants(User user, ChatChannel channel, string to=null)
- {
- if (channel == ChatChannel.All)
- {
- List recipiants = new List();
- foreach (GameClient client in GameClient.ConnectedClients)
- {
- if (client.LoggedIn)
- if (!client.LoggedinUser.MuteGlobal && !client.LoggedinUser.MuteAll)
- if (client.LoggedinUser.Id != user.Id)
- if(!client.LoggedinUser.MutePlayer.IsUserMuted(user))
- recipiants.Add(client);
- }
- return recipiants.ToArray();
- }
-
- if(channel == ChatChannel.Ads)
- {
- List recipiants = new List();
- foreach (GameClient client in GameClient.ConnectedClients)
- {
- if (client.LoggedIn)
- if (!client.LoggedinUser.MuteAds && !client.LoggedinUser.MuteAll)
- if (client.LoggedinUser.Id != user.Id)
- if (!client.LoggedinUser.MutePlayer.IsUserMuted(user))
- recipiants.Add(client);
- }
- return recipiants.ToArray();
- }
-
- if(channel == ChatChannel.Buddies)
- {
- List recipiants = new List();
- foreach (GameClient client in GameClient.ConnectedClients)
- {
- if (client.LoggedIn)
- if (!client.LoggedinUser.MuteBuddy && !client.LoggedinUser.MuteAll)
- if (client.LoggedinUser.Id != user.Id)
- if (client.LoggedinUser.Friends.List.Contains(user.Id))
- if (!client.LoggedinUser.MutePlayer.IsUserMuted(user))
- recipiants.Add(client);
- }
- return recipiants.ToArray();
- }
-
- if (channel == ChatChannel.Isle)
- {
- List recipiants = new List();
- if(World.InIsle(user.X,user.Y))
- {
- User[] usersInSile = GameServer.GetUsersInIsle(World.GetIsle(user.X, user.Y), true, false);
- foreach (User userInIsle in usersInSile)
- {
- if (user.Id != userInIsle.Id)
- if(!userInIsle.MuteAll && !userInIsle.MuteIsland)
- if(!userInIsle.MutePlayer.IsUserMuted(user))
- recipiants.Add(userInIsle.LoggedinClient);
- }
- return recipiants.ToArray();
- }
- else
- {
- return new GameClient[0];
- }
-
- }
-
- if (channel == ChatChannel.Here)
- {
- List recipiants = new List();
- User[] usersHere = GameServer.GetUsersAt(user.X, user.Y, true, false);
- foreach (User userHere in usersHere)
- {
- if (user.Id != userHere.Id)
- if (!userHere.MuteAll && !userHere.MuteHere)
- if (!userHere.MutePlayer.IsUserMuted(user))
- recipiants.Add(userHere.LoggedinClient);
- }
- return recipiants.ToArray();
- }
-
- if (channel == ChatChannel.Near)
- {
- List recipiants = new List();
- User[] nearbyUsers = GameServer.GetNearbyUsers(user.X, user.Y, true, false);
- foreach (User nearbyUser in nearbyUsers)
- {
- if (user.Id != nearbyUser.Id)
- if (!nearbyUser.MuteAll && !nearbyUser.MuteNear)
- if (!nearbyUser.MutePlayer.IsUserMuted(user))
- recipiants.Add(nearbyUser.LoggedinClient);
- }
- return recipiants.ToArray();
- }
-
- if (channel == ChatChannel.Mod)
- {
- if (!user.Moderator && !user.Administrator) // No mod chat for non-mods!
- {
- Logger.WarnPrint(user.Username + " attempted to send in MOD chat, without being a MOD.");
- return new GameClient[0];
- }
-
- List recipiants = new List();
- foreach (GameClient client in GameClient.ConnectedClients)
- {
- if (client.LoggedIn)
- if (client.LoggedinUser.Moderator)
- if (client.LoggedinUser.Id != user.Id)
- recipiants.Add(client);
- }
- return recipiants.ToArray();
- }
-
- if(channel == ChatChannel.Admin)
- {
- if (!user.Administrator) // No admin chat for non-admins!
- {
- Logger.WarnPrint(user.Username + " attempted to send in ADMIN chat, without being an ADMIN.");
- return new GameClient[0];
- }
-
-
- List recipiants = new List();
- foreach (GameClient client in GameClient.ConnectedClients)
- {
- if (client.LoggedIn)
- if (client.LoggedinUser.Administrator)
- if (client.LoggedinUser.Id != user.Id)
- recipiants.Add(client);
- }
- return recipiants.ToArray();
- }
-
- if(channel == ChatChannel.Dm)
- {
- if (to != null && to != "")
- {
- List recipiants = new List();
- foreach (GameClient client in GameClient.ConnectedClients)
- {
- if (client.LoggedIn)
- {
- if (!client.LoggedinUser.MutePrivateMessage && !client.LoggedinUser.MuteAll)
- {
- if (client.LoggedinUser.Username.ToLower().StartsWith(to.ToLower()))
- {
- recipiants.Add(client);
- break;
- }
-
- }
- }
- }
- return recipiants.ToArray();
- }
- else
- {
- Logger.ErrorPrint("Channel is " + channel + " (DM) BUT no 'to' Paramater was specfied");
- return new GameClient[0];
- }
- }
-
-
- Logger.ErrorPrint(user.Username + " Sent message in unknown channel: " + (byte)channel);
- return new GameClient[0]; // No recipiants
- }
-
- public static string DoCorrections(string message)
- {
- if (!ConfigReader.DoCorrections)
- return message;
-
- foreach(Correction correct in CorrectedWords)
- message = message.Replace(correct.FilteredWord, correct.ReplacedWord);
-
- return message.Trim();
- }
- public static string EscapeMessage(string message)
- {
- return message.Replace("<", "<");
- }
-
- public static string FormatChatForOthers(User user, ChatChannel channel, string message, bool autoReply=false)
- {
-
- switch (channel)
- {
- case ChatChannel.All:
- if (user.Moderator || user.Administrator)
- return Messages.FormatGlobalChatMessageForMod(user.Username, message);
- else
- return Messages.FormatGlobalChatMessage(user.Username, message);
- case ChatChannel.Ads:
- return Messages.FormatAdsChatMessage(user.Username, message);
- case ChatChannel.Buddies:
- return Messages.FormatBuddyChatMessage(user.Username, message);
- case ChatChannel.Dm:
- string badge = "";
- if (user.Moderator || user.Administrator)
- badge += Messages.DmModBadge;
- if (autoReply)
- badge += Messages.DmAutoResponse;
- return Messages.FormatDirectMessage(user.Username, message, badge);
- case ChatChannel.Near:
- return Messages.FormatNearbyChatMessage(user.Username, message);
- case ChatChannel.Isle:
- return Messages.FormatIsleChatMessage(user.Username, message);
- case ChatChannel.Here:
- return Messages.FormatHereChatMessage(user.Username, message);
- case ChatChannel.Mod:
- if (user.Moderator || user.Administrator)
- return Messages.FormatModChatMessage(user.Username, message);
- else
- {
- Logger.HackerPrint(user.Username + " Tried to send in mod chat without being a moderator. (Hack/Code Attempt)");
- return "";
- }
- case ChatChannel.Admin:
- if (user.Administrator)
- return Messages.FormatAdminChatMessage(user.Username, message);
- else
- {
- Logger.HackerPrint(user.Username + " Tried to send in mod chat without being a moderator. (Hack/Code Attempt)");
- return "";
- }
- default:
- Logger.ErrorPrint(user.Username + " is trying to end a message in unknown channel " + channel.ToString("X"));
- return "not implemented yet :(";
- }
- }
- public static string FormatChatForSender(User user, ChatChannel channel, string message, string dmRecipiant=null, bool autoReply=false)
- {
- switch (channel)
- {
- case ChatChannel.All:
- if (user.Moderator || user.Administrator)
- return Messages.FormatGlobalChatMessageForMod(user.Username, message);
- else
- return Messages.FormatGlobalChatMessage(user.Username, message);
- case ChatChannel.Ads:
- int numbListening = GameServer.GetNumberOfPlayersListeningToAdsChat(); // vry specific function ik
- return Messages.FormatAdsChatForSender(numbListening-1, user.Username, message);
- case ChatChannel.Buddies:
- return Messages.FormatBuddyChatMessageForSender(GameServer.GetNumberOfBuddiesOnline(user), user.Username, message);
- case ChatChannel.Isle:
- int inIsle = 0;
- if (World.InIsle(user.X, user.Y))
- inIsle = GameServer.GetUsersInIsle(World.GetIsle(user.X, user.Y), false, false).Length -1;
- return Messages.FormatIsleChatMessageForSender(inIsle, user.Username, message);
- case ChatChannel.Here:
- int usersHere = GameServer.GetUsersAt(user.X, user.Y, false, false).Length -1;
- return Messages.FormatHereChatMessageForSender(usersHere, user.Username, message);
- case ChatChannel.Near:
- int nearbyUsers = GameServer.GetNearbyUsers(user.X, user.Y, false, false).Length -1;
- return Messages.FormatNearChatMessageForSender(nearbyUsers, user.Username, message);
- case ChatChannel.Mod:
- int modsOnline = GameServer.GetNumberOfModsOnline() - 1;
- return Messages.FormatModChatForSender(modsOnline, user.Username, message);
- case ChatChannel.Admin:
- int adminsOnline = GameServer.GetNumberOfAdminsOnline() - 1;
- return Messages.FormatAdminChatForSender(adminsOnline, user.Username, message);
- case ChatChannel.Dm:
- string badge = "";
- if (user.Moderator || user.Administrator)
- badge += Messages.DmModBadge;
- if (autoReply)
- badge += Messages.DmAutoResponse;
- return Messages.FormatDirectChatMessageForSender(user.Username, dmRecipiant, message, badge);
- default:
- Logger.ErrorPrint(user.Username + " is trying to end a message in unknown channel " + channel.ToString("X"));
- return "not implemented yet :(";
- }
- }
-
- public static string NonViolationChecks(User user, string message)
- {
- if(!ConfigReader.DoNonViolations)
- return null;
-
- // Check if contains password.
- if (message.ToLower().Contains(user.Password.ToLower()))
- return Messages.PasswordNotice;
-
- // Check if ALL CAPS
- string[] wordsSaid;
- if (message.Contains(' '))
- wordsSaid = message.Split(' ');
- else
- wordsSaid = new string[] { message };
-
- foreach (string word in wordsSaid)
- {
- string lettersOnly = "";
- foreach(char c in word)
- {
- if((byte)c >= (byte)'A' && (byte)c <= (byte)'z') // is letter
- {
- lettersOnly += c;
- }
- }
- if (lettersOnly.ToUpper() == lettersOnly && lettersOnly.Length >= 5)
- return Messages.CapsNotice;
- }
-
- return null;
- }
- public static Reason GetReason(string name)
- {
- foreach (Reason reason in Reasons)
- if (reason.Name == name)
- return reason;
-
- throw new KeyNotFoundException("Reason " + name + " not found.");
- }
-
- }
-}
+ }
+ return false;
+ }
+ public static Object FilterMessage(string message) // Handles chat filtering and violation stuffs
+ {
+ if (!ConfigReader.BadWords) // Freedom of Speech Mode
+ return null;
+
+
+ string[] wordsSaid;
+ if (message.Contains(' '))
+ wordsSaid = message.Split(' ');
+ else
+ wordsSaid = new string[] { message };
+
+
+ foreach(Filter filter in FilteredWords)
+ {
+ if (!filter.MatchAll)
+ {
+ foreach (string word in wordsSaid)
+ {
+ if (word.ToLower() == filter.FilteredWord.ToLower())
+ return filter.Reason;
+ }
+ }
+ else
+ {
+ if (message.ToLower().Contains(filter.FilteredWord))
+ return filter.Reason;
+ }
+ }
+
+ return null;
+ }
+
+ public static byte GetSide(ChatChannel channel)
+ {
+ switch (channel)
+ {
+ case ChatChannel.All:
+ case ChatChannel.Ads:
+ case ChatChannel.Isle:
+ return PacketBuilder.CHAT_BOTTOM_LEFT;
+ case ChatChannel.Buddies:
+ case ChatChannel.Here:
+ case ChatChannel.Admin:
+ case ChatChannel.Mod:
+ return PacketBuilder.CHAT_BOTTOM_RIGHT;
+ case ChatChannel.Dm:
+ return PacketBuilder.CHAT_DM_RIGHT;
+ default:
+ Logger.ErrorPrint("unknown channel: " + (byte)channel);
+ return PacketBuilder.CHAT_BOTTOM_LEFT;
+ }
+
+ }
+
+ public static string GetDmRecipiant(string message)
+ {
+ if(message.Contains('|'))
+ {
+ string recipiantName = message.Split('|')[0];
+ return recipiantName;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public static string GetDmMessage(string message)
+ {
+ if (message.Contains('|'))
+ {
+ string messageStr = message.Split('|')[1];
+ return messageStr;
+ }
+ else
+ {
+ return message;
+ }
+ }
+
+ public static GameClient[] GetRecipiants(User user, ChatChannel channel, string to=null)
+ {
+ if (channel == ChatChannel.All)
+ {
+ List recipiants = new List();
+ foreach (GameClient client in GameClient.ConnectedClients)
+ {
+ if (client.LoggedIn)
+ if (!client.LoggedinUser.MuteGlobal && !client.LoggedinUser.MuteAll)
+ if (client.LoggedinUser.Id != user.Id)
+ if(!client.LoggedinUser.MutePlayer.IsUserMuted(user))
+ recipiants.Add(client);
+ }
+ return recipiants.ToArray();
+ }
+
+ if(channel == ChatChannel.Ads)
+ {
+ List recipiants = new List();
+ foreach (GameClient client in GameClient.ConnectedClients)
+ {
+ if (client.LoggedIn)
+ if (!client.LoggedinUser.MuteAds && !client.LoggedinUser.MuteAll)
+ if (client.LoggedinUser.Id != user.Id)
+ if (!client.LoggedinUser.MutePlayer.IsUserMuted(user))
+ recipiants.Add(client);
+ }
+ return recipiants.ToArray();
+ }
+
+ if(channel == ChatChannel.Buddies)
+ {
+ List recipiants = new List();
+ foreach (GameClient client in GameClient.ConnectedClients)
+ {
+ if (client.LoggedIn)
+ if (!client.LoggedinUser.MuteBuddy && !client.LoggedinUser.MuteAll)
+ if (client.LoggedinUser.Id != user.Id)
+ if (client.LoggedinUser.Friends.List.Contains(user.Id))
+ if (!client.LoggedinUser.MutePlayer.IsUserMuted(user))
+ recipiants.Add(client);
+ }
+ return recipiants.ToArray();
+ }
+
+ if (channel == ChatChannel.Isle)
+ {
+ List recipiants = new List();
+ if(World.InIsle(user.X,user.Y))
+ {
+ User[] usersInSile = GameServer.GetUsersInIsle(World.GetIsle(user.X, user.Y), true, false);
+ foreach (User userInIsle in usersInSile)
+ {
+ if (user.Id != userInIsle.Id)
+ if(!userInIsle.MuteAll && !userInIsle.MuteIsland)
+ if(!userInIsle.MutePlayer.IsUserMuted(user))
+ recipiants.Add(userInIsle.LoggedinClient);
+ }
+ return recipiants.ToArray();
+ }
+ else
+ {
+ return new GameClient[0];
+ }
+
+ }
+
+ if (channel == ChatChannel.Here)
+ {
+ List recipiants = new List();
+ User[] usersHere = GameServer.GetUsersAt(user.X, user.Y, true, false);
+ foreach (User userHere in usersHere)
+ {
+ if (user.Id != userHere.Id)
+ if (!userHere.MuteAll && !userHere.MuteHere)
+ if (!userHere.MutePlayer.IsUserMuted(user))
+ recipiants.Add(userHere.LoggedinClient);
+ }
+ return recipiants.ToArray();
+ }
+
+ if (channel == ChatChannel.Near)
+ {
+ List recipiants = new List();
+ User[] nearbyUsers = GameServer.GetNearbyUsers(user.X, user.Y, true, false);
+ foreach (User nearbyUser in nearbyUsers)
+ {
+ if (user.Id != nearbyUser.Id)
+ if (!nearbyUser.MuteAll && !nearbyUser.MuteNear)
+ if (!nearbyUser.MutePlayer.IsUserMuted(user))
+ recipiants.Add(nearbyUser.LoggedinClient);
+ }
+ return recipiants.ToArray();
+ }
+
+ if (channel == ChatChannel.Mod)
+ {
+ if (!user.Moderator && !user.Administrator) // No mod chat for non-mods!
+ {
+ Logger.WarnPrint(user.Username + " attempted to send in MOD chat, without being a MOD.");
+ return new GameClient[0];
+ }
+
+ List recipiants = new List();
+ foreach (GameClient client in GameClient.ConnectedClients)
+ {
+ if (client.LoggedIn)
+ if (client.LoggedinUser.Moderator)
+ if (client.LoggedinUser.Id != user.Id)
+ recipiants.Add(client);
+ }
+ return recipiants.ToArray();
+ }
+
+ if(channel == ChatChannel.Admin)
+ {
+ if (!user.Administrator) // No admin chat for non-admins!
+ {
+ Logger.WarnPrint(user.Username + " attempted to send in ADMIN chat, without being an ADMIN.");
+ return new GameClient[0];
+ }
+
+
+ List recipiants = new List();
+ foreach (GameClient client in GameClient.ConnectedClients)
+ {
+ if (client.LoggedIn)
+ if (client.LoggedinUser.Administrator)
+ if (client.LoggedinUser.Id != user.Id)
+ recipiants.Add(client);
+ }
+ return recipiants.ToArray();
+ }
+
+ if(channel == ChatChannel.Dm)
+ {
+ if (to != null && to != "")
+ {
+ List recipiants = new List();
+ foreach (GameClient client in GameClient.ConnectedClients)
+ {
+ if (client.LoggedIn)
+ {
+ if (!client.LoggedinUser.MutePrivateMessage && !client.LoggedinUser.MuteAll)
+ {
+ if (client.LoggedinUser.Username.ToLower().StartsWith(to.ToLower()))
+ {
+ recipiants.Add(client);
+ break;
+ }
+
+ }
+ }
+ }
+ return recipiants.ToArray();
+ }
+ else
+ {
+ Logger.ErrorPrint("Channel is " + channel + " (DM) BUT no 'to' Paramater was specfied");
+ return new GameClient[0];
+ }
+ }
+
+
+ Logger.ErrorPrint(user.Username + " Sent message in unknown channel: " + (byte)channel);
+ return new GameClient[0]; // No recipiants
+ }
+
+ public static string DoCorrections(string message)
+ {
+ if (!ConfigReader.DoCorrections)
+ return message;
+
+ foreach(Correction correct in CorrectedWords)
+ message = message.Replace(correct.FilteredWord, correct.ReplacedWord);
+
+ return message.Trim();
+ }
+ public static string EscapeMessage(string message)
+ {
+ return message.Replace("<", "<");
+ }
+
+ public static string FormatChatForOthers(User user, ChatChannel channel, string message, bool autoReply=false)
+ {
+
+ switch (channel)
+ {
+ case ChatChannel.All:
+ if (user.Moderator || user.Administrator)
+ return Messages.FormatGlobalChatMessageForMod(user.Username, message);
+ else
+ return Messages.FormatGlobalChatMessage(user.Username, message);
+ case ChatChannel.Ads:
+ return Messages.FormatAdsChatMessage(user.Username, message);
+ case ChatChannel.Buddies:
+ return Messages.FormatBuddyChatMessage(user.Username, message);
+ case ChatChannel.Dm:
+ string badge = "";
+ if (user.Moderator || user.Administrator)
+ badge += Messages.DmModBadge;
+ if (autoReply)
+ badge += Messages.DmAutoResponse;
+ return Messages.FormatDirectMessage(user.Username, message, badge);
+ case ChatChannel.Near:
+ return Messages.FormatNearbyChatMessage(user.Username, message);
+ case ChatChannel.Isle:
+ return Messages.FormatIsleChatMessage(user.Username, message);
+ case ChatChannel.Here:
+ return Messages.FormatHereChatMessage(user.Username, message);
+ case ChatChannel.Mod:
+ if (user.Moderator || user.Administrator)
+ return Messages.FormatModChatMessage(user.Username, message);
+ else
+ {
+ Logger.HackerPrint(user.Username + " Tried to send in mod chat without being a moderator. (Hack/Code Attempt)");
+ return "";
+ }
+ case ChatChannel.Admin:
+ if (user.Administrator)
+ return Messages.FormatAdminChatMessage(user.Username, message);
+ else
+ {
+ Logger.HackerPrint(user.Username + " Tried to send in mod chat without being a moderator. (Hack/Code Attempt)");
+ return "";
+ }
+ default:
+ Logger.ErrorPrint(user.Username + " is trying to end a message in unknown channel " + channel.ToString("X"));
+ return "not implemented yet :(";
+ }
+ }
+ public static string FormatChatForSender(User user, ChatChannel channel, string message, string dmRecipiant=null, bool autoReply=false)
+ {
+ switch (channel)
+ {
+ case ChatChannel.All:
+ if (user.Moderator || user.Administrator)
+ return Messages.FormatGlobalChatMessageForMod(user.Username, message);
+ else
+ return Messages.FormatGlobalChatMessage(user.Username, message);
+ case ChatChannel.Ads:
+ int numbListening = GameServer.GetNumberOfPlayersListeningToAdsChat(); // vry specific function ik
+ return Messages.FormatAdsChatForSender(numbListening-1, user.Username, message);
+ case ChatChannel.Buddies:
+ return Messages.FormatBuddyChatMessageForSender(GameServer.GetNumberOfBuddiesOnline(user), user.Username, message);
+ case ChatChannel.Isle:
+ int inIsle = 0;
+ if (World.InIsle(user.X, user.Y))
+ inIsle = GameServer.GetUsersInIsle(World.GetIsle(user.X, user.Y), false, false).Length -1;
+ return Messages.FormatIsleChatMessageForSender(inIsle, user.Username, message);
+ case ChatChannel.Here:
+ int usersHere = GameServer.GetUsersAt(user.X, user.Y, false, false).Length -1;
+ return Messages.FormatHereChatMessageForSender(usersHere, user.Username, message);
+ case ChatChannel.Near:
+ int nearbyUsers = GameServer.GetNearbyUsers(user.X, user.Y, false, false).Length -1;
+ return Messages.FormatNearChatMessageForSender(nearbyUsers, user.Username, message);
+ case ChatChannel.Mod:
+ int modsOnline = GameServer.GetNumberOfModsOnline() - 1;
+ return Messages.FormatModChatForSender(modsOnline, user.Username, message);
+ case ChatChannel.Admin:
+ int adminsOnline = GameServer.GetNumberOfAdminsOnline() - 1;
+ return Messages.FormatAdminChatForSender(adminsOnline, user.Username, message);
+ case ChatChannel.Dm:
+ string badge = "";
+ if (user.Moderator || user.Administrator)
+ badge += Messages.DmModBadge;
+ if (autoReply)
+ badge += Messages.DmAutoResponse;
+ return Messages.FormatDirectChatMessageForSender(user.Username, dmRecipiant, message, badge);
+ default:
+ Logger.ErrorPrint(user.Username + " is trying to end a message in unknown channel " + channel.ToString("X"));
+ return "not implemented yet :(";
+ }
+ }
+
+ public static string NonViolationChecks(User user, string message)
+ {
+ if(!ConfigReader.DoNonViolations)
+ return null;
+
+ // Check if contains password.
+ if (message.ToLower().Contains(user.Password.ToLower()))
+ return Messages.PasswordNotice;
+
+ // Check if ALL CAPS
+ string[] wordsSaid;
+ if (message.Contains(' '))
+ wordsSaid = message.Split(' ');
+ else
+ wordsSaid = new string[] { message };
+
+ foreach (string word in wordsSaid)
+ {
+ string lettersOnly = "";
+ foreach(char c in word)
+ {
+ if((byte)c >= (byte)'A' && (byte)c <= (byte)'z') // is letter
+ {
+ lettersOnly += c;
+ }
+ }
+ if (lettersOnly.ToUpper() == lettersOnly && lettersOnly.Length >= 5)
+ return Messages.CapsNotice;
+ }
+
+ return null;
+ }
+ public static Reason GetReason(string name)
+ {
+ foreach (Reason reason in Reasons)
+ if (reason.Name == name)
+ return reason;
+
+ throw new KeyNotFoundException("Reason " + name + " not found.");
+ }
+
+ }
+}
diff --git a/HorseIsleServer/LibHISP/Game/Chat/Command.cs b/HorseIsleServer/LibHISP/Game/Chat/Command.cs
index df20e55..5c6fde2 100644
--- a/HorseIsleServer/LibHISP/Game/Chat/Command.cs
+++ b/HorseIsleServer/LibHISP/Game/Chat/Command.cs
@@ -4,7 +4,6 @@ using HISP.Game.Items;
using HISP.Game.Events;
using HISP.Game.Horse;
using HISP.Game.Inventory;
-using HISP.Modding;
using System.Linq;
using System;
@@ -70,7 +69,6 @@ namespace HISP.Game.Chat
if (!user.Administrator)
return false;
- ModLoader.ReloadModsFromFilesystem();
byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message), PacketBuilder.CHAT_BOTTOM_LEFT);
user.LoggedinClient.SendPacket(chatPacket);
diff --git a/HorseIsleServer/LibHISP/LibHISP.csproj b/HorseIsleServer/LibHISP/LibHISP.csproj
index f4b5408..1b99b14 100644
--- a/HorseIsleServer/LibHISP/LibHISP.csproj
+++ b/HorseIsleServer/LibHISP/LibHISP.csproj
@@ -218,6 +218,6 @@
-
+
diff --git a/HorseIsleServer/LibHISP/LibHISP.csproj.user b/HorseIsleServer/LibHISP/LibHISP.csproj.user
index 19a143c..ed08094 100644
--- a/HorseIsleServer/LibHISP/LibHISP.csproj.user
+++ b/HorseIsleServer/LibHISP/LibHISP.csproj.user
@@ -1,6 +1,6 @@
- <_LastSelectedProfileId>C:\Users\User\Documents\git\HISP\HorseIsleServer\LibHISP\Properties\PublishProfiles\iOSARM.pubxml
+ <_LastSelectedProfileId>C:\Users\User\Documents\git\HISP\HorseIsleServer\LibHISP\Properties\PublishProfiles\Linux64.pubxml
\ No newline at end of file
diff --git a/HorseIsleServer/LibHISP/Modding/IMod.cs b/HorseIsleServer/LibHISP/Modding/IMod.cs
deleted file mode 100644
index cd926ec..0000000
--- a/HorseIsleServer/LibHISP/Modding/IMod.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-namespace HISP.Modding
-{
- public interface IMod
- {
- public void OnModLoad();
- public void OnModUnload();
- public string ModName
- {
- get;
- }
- public string ModVersion
- {
- get;
- }
- public string ModId
- {
- get;
- }
- }
-}
diff --git a/HorseIsleServer/LibHISP/Modding/ModLoader.cs b/HorseIsleServer/LibHISP/Modding/ModLoader.cs
deleted file mode 100644
index 8b53ba9..0000000
--- a/HorseIsleServer/LibHISP/Modding/ModLoader.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-using HISP.Server;
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Reflection;
-
-namespace HISP.Modding
-{
- public class ModLoader
- {
- private static List modList = new List();
- public static IMod[] ModList
- {
- get
- {
- return modList.ToArray();
- }
- }
- public static void LoadMod(IMod mod)
- {
- mod.OnModLoad(); // Call OnModLoad();
- modList.Add(mod); // add to the list of mods
- Logger.InfoPrint("Loaded mod: "+mod.ModName + " v" + mod.ModVersion + " SUCCESS.");
- }
- public static void UnloadMod(IMod mod)
- {
- mod.OnModUnload();
- modList.Remove(mod);
- Logger.InfoPrint("Unloading mod: " + mod.ModName);
- }
- public static void UnloadAllMods()
- {
- foreach (IMod loadedMod in ModList)
- {
- UnloadMod(loadedMod);
- }
- }
- public static void LoadModFromFilesystem(string dllfile)
- {
- try
- {
- Assembly assembly = Assembly.LoadFile(dllfile);
- Type[] types = assembly.GetTypes();
- // Search for classes that implement IMod
- foreach (Type type in types)
- {
- if (type.GetInterfaces().Contains(typeof(IMod)))
- {
- IMod mod = (IMod)Activator.CreateInstance(type); // Crate an instance of the class
- LoadMod(mod); // Load it into memory
- }
- }
- }
- catch (Exception e)
- {
- Logger.ErrorPrint("Failed to load mod: " + dllfile + " - [EXCEPTION]" + e.Message + " " + e.InnerException + "\n" + e.StackTrace);
- }
- }
- public static void OnShutdown()
- {
- UnloadAllMods();
- }
- public static void ReloadModsFromFilesystem()
- {
- UnloadAllMods();
- if (Directory.Exists(ConfigReader.ModsFolder))
- {
- string[] filelist = Directory.GetFiles(ConfigReader.ModsFolder, "*.dll", SearchOption.TopDirectoryOnly);
- foreach (string file in filelist)
- {
- LoadModFromFilesystem(file);
- }
- }
- }
- }
-}
diff --git a/HorseIsleServer/LibHISP/Server/Entry.cs b/HorseIsleServer/LibHISP/Server/Entry.cs
index 3e51553..732b3d2 100644
--- a/HorseIsleServer/LibHISP/Server/Entry.cs
+++ b/HorseIsleServer/LibHISP/Server/Entry.cs
@@ -1,76 +1,74 @@
-using HISP.Game;
-using HISP.Game.Horse;
-using HISP.Game.Items;
-using HISP.Game.Services;
-using HISP.Game.SwfModules;
-using HISP.Game.Chat;
-using HISP.Security;
-using System;
-using System.Diagnostics;
-using HISP.Modding;
+using HISP.Game;
+using HISP.Game.Horse;
+using HISP.Game.Items;
+using HISP.Game.Services;
+using HISP.Game.SwfModules;
+using HISP.Game.Chat;
+using HISP.Security;
+using System;
+using System.Diagnostics;
-namespace HISP.Server
-{
- public static class Entry
- {
- // "Entry Point"
-
- private static void defaultOnShutdownCallback()
- {
- Process.GetCurrentProcess().Close();
- }
- public static Action OnShutdown = defaultOnShutdownCallback;
-
-
- public static void SetShutdownCallback(Action callback)
- {
- OnShutdown = callback;
- }
-
- public static void Start()
+namespace HISP.Server
+{
+ public static class Entry
+ {
+ // "Entry Point"
+
+ private static void defaultOnShutdownCallback()
{
-#if (!DEBUG)
- AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
-#endif
+ Process.GetCurrentProcess().Close();
+ }
+ public static Action OnShutdown = defaultOnShutdownCallback;
- ModLoader.ReloadModsFromFilesystem();
-
- 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();
- Command.RegisterCommands();
-
- GameServer.StartServer();
- }
-
- private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
- {
- Exception execpt = (Exception)e.ExceptionObject;
-
- Logger.ErrorPrint("HISP HAS CRASHED :(");
- Logger.ErrorPrint("Unhandled Exception: " + execpt.ToString());
- Logger.ErrorPrint(execpt.Message);
- Logger.ErrorPrint("");
- Logger.ErrorPrint(execpt.StackTrace);
-
- while (true) { /* Allow asyncronous operations to happen. */ };
- }
- }
-}
+
+ public static void SetShutdownCallback(Action callback)
+ {
+ OnShutdown = callback;
+ }
+
+ public static void Start()
+ {
+#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();
+ Command.RegisterCommands();
+
+ GameServer.StartServer();
+ }
+
+ private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
+ {
+ Exception execpt = (Exception)e.ExceptionObject;
+
+ Logger.ErrorPrint("HISP HAS CRASHED :(");
+ Logger.ErrorPrint("Unhandled Exception: " + execpt.ToString());
+ Logger.ErrorPrint(execpt.Message);
+ Logger.ErrorPrint("");
+ Logger.ErrorPrint(execpt.StackTrace);
+
+ while (true) { /* Allow asyncronous operations to happen. */ };
+ }
+ }
+}
diff --git a/HorseIsleServer/LibHISP/Server/GameServer.cs b/HorseIsleServer/LibHISP/Server/GameServer.cs
index 15a2f07..2c1f3ee 100644
--- a/HorseIsleServer/LibHISP/Server/GameServer.cs
+++ b/HorseIsleServer/LibHISP/Server/GameServer.cs
@@ -1,8287 +1,8285 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Net;
-using System.Net.Sockets;
-using System.Text;
-using System.Threading;
-using System.Drawing;
-
-using HISP.Player;
-using HISP.Game;
-using HISP.Security;
-using HISP.Game.Chat;
-using HISP.Player.Equips;
-using HISP.Game.Services;
-using HISP.Game.Inventory;
-using HISP.Game.SwfModules;
-using HISP.Game.Horse;
-using HISP.Game.Events;
-using HISP.Game.Items;
-using HISP.Modding;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Net.Sockets;
+using System.Text;
+using System.Threading;
+using System.Drawing;
-namespace HISP.Server
-{
- public class GameServer
- {
-
- public static Socket ServerSocket;
-
- public static int IdleTimeout;
- public static int IdleWarning;
-
- public static Random RandomNumberGenerator = new Random();
-
- // Events
- public static RealTimeRiddle RiddleEvent = RealTimeRiddle.GetRandomRiddle();
- public static TackShopGiveaway TackShopGiveawayEvent = null;
- public static RealTimeQuiz QuizEvent = null;
- public static WaterBalloonGame WaterBalloonEvent = new WaterBalloonGame();
- public static IsleCardTradingGame IsleCardTrading;
- public static ModsRevenge ModsRevengeEvent = new ModsRevenge();
-
- /*
- * Private stuff
- */
- private static int gameTickSpeed = 4800; // Changing this to ANYTHING else will cause desync with the client.
- private static int totalMinutesElapsed = 0;
- private static int oneMinute = 1000 * 60;
- private static Timer gameTimer; // Controls in-game time.
- private static Timer minuteTimer; // ticks every real world minute.
- private static void onGameTick(object state)
- {
- // Tick the game clock.
- World.TickWorldClock();
-
- // Start all events with this RaceEvery set.
- Arena.StartArenas(World.ServerTime.Minutes);
-
- // Decrement horse train timer
- Database.DecHorseTrainTimeout();
-
- // Write time to database:
- Database.SetServerTime(World.ServerTime.Minutes, World.ServerTime.Days, World.ServerTime.Years);
-
- // Ranch Windmill Payments
- if (World.ServerTime.Minutes % 720 == 0) // every 12 hours
- {
- Logger.DebugPrint("Paying windmill owners . . . ");
- foreach (Ranch ranch in Ranch.Ranches)
- {
- int ranchOwner = ranch.OwnerId;
- if (ranchOwner != -1)
- {
- int moneyToAdd = 5000 * ranch.GetBuildingCount(8); // Windmill
- if (GameServer.IsUserOnline(ranchOwner))
- GameServer.GetUserById(ranchOwner).AddMoney(moneyToAdd);
- else
- {
- try
- {
- Database.SetPlayerMoney(Database.GetPlayerMoney(ranchOwner) + moneyToAdd, ranchOwner);
- }
- catch (OverflowException)
- {
- Database.SetPlayerMoney(2147483647, ranchOwner);
- }
- }
- }
- }
- }
-
- if((World.StartDate != -1)) // Birthday tokens
- {
- int curTime = (int)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
- if (curTime >= World.StartDate + 378691200)
- {
- Logger.InfoPrint("Your server has been running for 12 years! Adding birthday tokens");
- Database.SetStartTime(-1);
- World.StartDate = -1;
-
-
- AddItemToAllUsersEvenOffline(Item.BirthdayToken, 10);
- }
-
- }
-
- gameTimer.Change(gameTickSpeed, gameTickSpeed);
-
- }
- private static void onMinuteTick(object state)
- {
- totalMinutesElapsed++;
-
- if (totalMinutesElapsed % 8 == 0)
- {
- Database.IncAllUsersFreeTime(1);
- }
-
- if (totalMinutesElapsed % 25 == 0)
- {
-
- Logger.DebugPrint("Randomizing Weather...");
- foreach (World.Town town in World.Towns)
- {
- if (RandomNumberGenerator.Next(0, 100) < 25)
- {
- town.Weather = town.SelectRandomWeather();
- }
- }
-
- foreach (World.Isle isle in World.Isles)
- {
- if (RandomNumberGenerator.Next(0, 100) < 25)
- {
- isle.Weather = isle.SelectRandomWeather();
- }
- }
- }
-
- /*
- * EVENTS
- */
-
- // Mods Revenge
- if(totalMinutesElapsed % ((60*8)+15) == 0)
- {
- ModsRevengeEvent.StartEvent();
- }
-
- // Isle Card Trading Game
- if(totalMinutesElapsed % (60 *2) == 0)
- {
- IsleCardTrading = new IsleCardTradingGame();
- IsleCardTrading.StartEvent();
- }
-
- // Water Balloon Game
- if(totalMinutesElapsed % (60 * 2) == 0)
- {
- WaterBalloonEvent.StartEvent();
- }
-
- // Tack Shop Giveaway
- if(totalMinutesElapsed % ((60 * 3)+5) == 0)
- {
- TackShopGiveawayEvent = new TackShopGiveaway();
- TackShopGiveawayEvent.StartEvent();
- }
-
- // Real Time Riddle
- if(totalMinutesElapsed % (RealTimeRiddle.LastWon ? 20 : 15) == 0)
- {
- RiddleEvent = RealTimeRiddle.GetRandomRiddle();
- RiddleEvent.StartEvent();
- }
-
- // Real Time Quiz
- if(totalMinutesElapsed % (60 + 30) == 0)
- {
- QuizEvent = new RealTimeQuiz();
- QuizEvent.StartEvent();
- }
-
-
- if (totalMinutesElapsed % 60 == 0) // Do spoils
- {
- foreach (HorseInstance horse in Database.GetMostSpoiledHorses())
- {
- horse.BasicStats.Health = 1000;
- horse.BasicStats.Mood = 1000;
- horse.BasicStats.Hunger = 1000;
- horse.BasicStats.Thirst = 1000;
- }
- }
-
- if (totalMinutesElapsed % 5 == 0)
- {
- Treasure.AddValue();
- }
-
-
- foreach (GameClient client in GameClient.ConnectedClients)
- {
- if (client == null)
- continue;
-
- if (client.LoggedIn)
- {
- if (!client.LoggedinUser.MajorPriority)
- if(!client.LoggedinUser.MinorPriority)
- UpdateArea(client);
- byte[] BaseStatsPacketData = PacketBuilder.CreatePlayerData(client.LoggedinUser.Money, GameServer.GetNumberOfPlayers(), client.LoggedinUser.MailBox.UnreadMailCount);
- client.SendPacket(BaseStatsPacketData);
-
- UpdateWorld(client);
- UpdatePlayer(client);
- }
- }
-
- foreach(Auction auction in Auction.AuctionRooms.ToArray())
- {
- foreach(Auction.AuctionEntry entry in auction.AuctionEntries.ToArray())
- {
- entry.TimeRemaining--;
- if (entry.Completed)
- auction.DeleteEntry(entry);
- else if (entry.TimeRemaining <= 0)
- entry.Completed = true;
-
- auction.UpdateAuctionRoom();
- }
- }
-
-
-
- Database.IncPlayerTirednessForOfflineUsers();
-
- // Offline player handling w sql black magic...
-
- Database.DecrementHorseLeaseTimeForOfflinePlayers();
- Database.TpOfflinePlayersBackToUniterForOfflinePlayers();
- Database.DeleteExpiredLeasedHorsesForOfflinePlayers();
-
- DroppedItems.DespawnItems();
- DroppedItems.GenerateItems();
-
-
- WildHorse.Update();
- Npc.WanderNpcs();
- minuteTimer.Change(oneMinute, oneMinute);
- }
-
- /*
- * 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, byte[] packet)
- {
- if (Encoding.UTF8.GetString(packet).StartsWith(""))
- {
- Logger.DebugPrint("Cross-Domain-Policy request received from: " + sender.RemoteIp);
- byte[] crossDomainPolicyResponse = CrossDomainPolicy.GetPolicy();
- sender.SendPacket(crossDomainPolicyResponse);
-
- }
- }
-
- public static void OnPlayerInteration(GameClient sender, byte[] packet)
- {
- if (!sender.LoggedIn)
- {
- Logger.ErrorPrint(sender.RemoteIp + " Requested Bird Map when not logged in.");
- return;
- }
- byte method = packet[1];
- switch(method)
- {
- case PacketBuilder.PLAYER_INTERACTION_TRADE_REJECT:
- if (sender.LoggedinUser.TradingWith != null)
- sender.LoggedinUser.TradingWith.CancelTrade();
- break;
- case PacketBuilder.PLAYER_INTERACTION_ACCEPT:
- if (sender.LoggedinUser.TradingWith != null)
- sender.LoggedinUser.TradingWith.AcceptTrade();
- break;
- case PacketBuilder.PLAYER_INTERACTION_PROFILE:
- string packetStr = Encoding.UTF8.GetString(packet);
- string playerIdStr = packetStr.Substring(2, packetStr.Length - 4);
- int playerId = -1;
- try
- {
- playerId = int.Parse(playerIdStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to view profile of User ID NaN.");
- break;
- }
-
- if(IsUserOnline(playerId))
- {
- User user = GetUserById(playerId);
- sender.LoggedinUser.MajorPriority = true;
-
- byte[] metaTag = PacketBuilder.CreateMetaPacket(Meta.BuildStatsMenu(user, true));
- sender.SendPacket(metaTag);
- }
- break;
- case PacketBuilder.PLAYER_INTERACTION_MUTE:
- packetStr = Encoding.UTF8.GetString(packet);
- playerIdStr = packetStr.Substring(2, packetStr.Length - 4);
- playerId = -1;
- try
- {
- playerId = int.Parse(playerIdStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to MUTE User ID NaN.");
- break;
- }
-
- if (IsUserOnline(playerId))
- {
- User user = GetUserById(playerId);
- if(!sender.LoggedinUser.MutePlayer.IsUserMuted(user))
- sender.LoggedinUser.MutePlayer.MuteUser(user);
-
- byte[] nowMuting = PacketBuilder.CreateChat(Messages.FormatNowMutingPlayer(user.Username), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(nowMuting);
-
- sender.LoggedinUser.MajorPriority = true;
- byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildPlayerListMenu(sender.LoggedinUser));
- sender.SendPacket(metaPacket);
- }
- break;
- case PacketBuilder.PLAYER_INTERACTION_UNMUTE:
- packetStr = Encoding.UTF8.GetString(packet);
- playerIdStr = packetStr.Substring(2, packetStr.Length - 4);
- playerId = -1;
- try
- {
- playerId = int.Parse(playerIdStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to UNMUTE User ID NaN.");
- break;
- }
-
- if (IsUserOnline(playerId))
- {
- User user = GetUserById(playerId);
- if (sender.LoggedinUser.MutePlayer.IsUserMuted(user))
- sender.LoggedinUser.MutePlayer.UnmuteUser(user);
-
- byte[] stoppedMuting = PacketBuilder.CreateChat(Messages.FormatStoppedMutingPlayer(user.Username), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(stoppedMuting);
-
- sender.LoggedinUser.MajorPriority = true;
- byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildPlayerListMenu(sender.LoggedinUser));
- sender.SendPacket(metaPacket);
- }
- break;
- case PacketBuilder.PLAYER_INTERACTION_REMOVE_BUDDY:
- packetStr = Encoding.UTF8.GetString(packet);
- playerIdStr = packetStr.Substring(2, packetStr.Length - 4);
- playerId = -1;
- try
- {
- playerId = int.Parse(playerIdStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to remove User ID NaN as a buddy.");
- break;
- }
-
-
- if(sender.LoggedinUser.Friends.IsFriend(playerId))
- {
- sender.LoggedinUser.Friends.RemoveFriend(playerId);
-
- byte[] friendRemoved = PacketBuilder.CreateChat(Messages.FormatAddBuddyRemoveBuddy(Database.GetUsername(playerId)), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(friendRemoved);
-
- sender.LoggedinUser.MajorPriority = true;
- byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildPlayerListMenu(sender.LoggedinUser));
- sender.SendPacket(metaPacket);
- }
-
- break;
- case PacketBuilder.PLAYER_INTERACTION_TAG:
- packetStr = Encoding.UTF8.GetString(packet);
- playerIdStr = packetStr.Substring(2, packetStr.Length - 4);
- playerId = -1;
- try
- {
- playerId = int.Parse(playerIdStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to trade with User ID NaN.");
- break;
- }
-
- if (IsUserOnline(playerId))
- {
- User user = GetUserById(playerId);;
- string TAGYourIT = Messages.FormatTagYourIt(user.Username, sender.LoggedinUser.Username);
- int totalBuds = 0;
- foreach(int friendId in sender.LoggedinUser.Friends.List)
- {
- if (friendId == sender.LoggedinUser.Id)
- continue;
-
- if(IsUserOnline(friendId))
- {
- User buddy = GetUserById(friendId);
- byte[] tagYourItPacket = PacketBuilder.CreateChat(TAGYourIT, PacketBuilder.CHAT_BOTTOM_RIGHT);
- buddy.LoggedinClient.SendPacket(tagYourItPacket);
- totalBuds++;
- }
- }
- string budStr = Messages.FormatTagTotalBuddies(totalBuds);
-
- byte[] tagYouItPacket = PacketBuilder.CreateChat(TAGYourIT + budStr, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(tagYouItPacket);
-
- }
- break;
- case PacketBuilder.PLAYER_INTERACTION_ADD_BUDDY:
- packetStr = Encoding.UTF8.GetString(packet);
- playerIdStr = packetStr.Substring(2, packetStr.Length - 4);
- playerId = -1;
- try
- {
- playerId = int.Parse(playerIdStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to add friend with User ID NaN.");
- break;
- }
- if (IsUserOnline(playerId))
- {
- User userToAdd = GetUserById(playerId);
- sender.LoggedinUser.Friends.AddFriend(userToAdd);
- }
- break;
- case PacketBuilder.PLAYER_INTERACTION_ADD_ITEM:
- if (sender.LoggedinUser.TradingWith == null)
- break;
- if (packet.Length < 5)
- break;
-
- packetStr = Encoding.UTF8.GetString(packet);
- string idStr = packetStr.Substring(2, packetStr.Length - 4);
- char firstChar = idStr[0];
- switch(firstChar)
- {
- case '3': // Trade Money
-
- if (sender.LoggedinUser.Bids.Length > 0)
- {
- byte[] cantBuyWhileAuctioning = PacketBuilder.CreateChat(Messages.AuctionNoOtherTransactionAllowed, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantBuyWhileAuctioning);
- break;
- }
-
- sender.LoggedinUser.TradeMenuPriority = true;
- sender.LoggedinUser.AttemptingToOfferItem = -1;
- byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildTradeAddMoney(sender.LoggedinUser.TradingWith.MoneyOffered));
- sender.SendPacket(metaPacket);
-
- break;
- case '2': // Trade Horse
- string horseRandomIdStr = idStr.Substring(1);
- int horseRandomId = -1;
- try
- {
- horseRandomId = int.Parse(horseRandomIdStr);
- }
- catch (FormatException)
- {
- break;
- }
-
- if (!sender.LoggedinUser.HorseInventory.HorseIdExist(horseRandomId))
- break;
-
- HorseInstance horse = sender.LoggedinUser.HorseInventory.GetHorseById(horseRandomId);
- if(!sender.LoggedinUser.TradingWith.HorsesOffered.Contains(horse))
- sender.LoggedinUser.TradingWith.OfferHorse(horse);
-
- UpdateArea(sender);
-
- if (sender.LoggedinUser.TradingWith != null)
- if (!sender.LoggedinUser.TradingWith.OtherTrade.Trader.TradeMenuPriority)
- UpdateArea(sender.LoggedinUser.TradingWith.OtherTrade.Trader.LoggedinClient);
-
- break;
- case '1': // Trade Item
- string itemIdStr = idStr.Substring(1);
- int itemId = -1;
- try
- {
- itemId = int.Parse(itemIdStr);
- }
- catch(FormatException)
- {
- break;
- }
-
- if (!sender.LoggedinUser.Inventory.HasItemId(itemId))
- break;
-
- sender.LoggedinUser.TradeMenuPriority = true;
- sender.LoggedinUser.AttemptingToOfferItem = itemId;
- InventoryItem item = sender.LoggedinUser.Inventory.GetItemByItemId(itemId);
- byte[] addItemPacket = PacketBuilder.CreateMetaPacket(Meta.BuildTradeAddItem(item.ItemInstances.Length));
- sender.SendPacket(addItemPacket);
- break;
-
- }
- break;
- case PacketBuilder.PLAYER_INTERACTION_TRADE:
- packetStr = Encoding.UTF8.GetString(packet);
- playerIdStr = packetStr.Substring(2, packetStr.Length - 4);
- playerId = -1;
- try
- {
- playerId = int.Parse(playerIdStr);
- }
- catch(FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to trade with User ID NaN.");
- break;
- }
- if(IsUserOnline(playerId))
- {
- User user = GetUserById(playerId);
- byte[] tradeMsg = PacketBuilder.CreateChat(Messages.TradeRequiresBothPlayersMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(tradeMsg);
-
- sender.LoggedinUser.PendingTradeTo = user.Id;
-
- if (user.PendingTradeTo == sender.LoggedinUser.Id)
- {
- // Start Trade
- Trade tradeWithYou = new Trade(sender.LoggedinUser);
- Trade tradeWithOther = new Trade(user);
- tradeWithYou.OtherTrade = tradeWithOther;
- tradeWithOther.OtherTrade = tradeWithYou;
-
- sender.LoggedinUser.TradingWith = tradeWithYou;
- user.TradingWith = tradeWithOther;
-
- UpdateArea(sender);
- UpdateArea(user.LoggedinClient);
- }
-
- }
- break;
- default:
- Logger.DebugPrint("Unknown Player interaction Method: 0x" + method.ToString("X") + " Packet: "+BitConverter.ToString(packet).Replace("-", " "));
- break;
- }
- return;
- }
- public static void OnSocialPacket(GameClient sender, byte[] packet)
- {
- if (!sender.LoggedIn)
- {
- Logger.ErrorPrint(sender.RemoteIp + " Tried to be socialable, but has no account and therefor no friends.");
- return;
- }
- byte method = packet[1];
-
- switch (method)
- {
- case PacketBuilder.SOCIALS_MENU:
- string packetStr = Encoding.UTF8.GetString(packet);
- string playerIdStr = packetStr.Substring(2, packetStr.Length - 4);
- int playerId = -1;
- try
- {
- playerId = int.Parse(playerIdStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to socialize with User ID NaN.");
- break;
- }
-
- if(IsUserOnline(playerId))
- {
- sender.LoggedinUser.SocializingWith = GetUserById(playerId);
-
- sender.LoggedinUser.SocializingWith.AddSocailizedWith(sender.LoggedinUser);
- sender.LoggedinUser.MajorPriority = true;
- byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildSocialMenu(sender.LoggedinUser.CurrentlyRidingHorse != null));
- sender.SendPacket(metaPacket);
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to socialize with User #"+playerId.ToString()+" but there not online.");
- }
- break;
- case PacketBuilder.SOCIALS_USE:
- int socialId = Convert.ToInt32(packet[2] - (byte)0x21);
- SocialType.Social social = SocialType.GetSocial(socialId);
- /*
- * Check if player being socialed with
- * is actually on this tile, not muted, etc
- */
- if (sender.LoggedinUser.SocializingWith != null && social.BaseSocialType.Type != "GROUP")
- {
- if (sender.LoggedinUser.SocializingWith.MuteAll || sender.LoggedinUser.SocializingWith.MuteSocials)
- {
- byte[] cantSocialize = PacketBuilder.CreateChat(Messages.PlayerIgnoringAllSocials, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantSocialize);
- break;
- }
-
- if (sender.LoggedinUser.SocializingWith.MutePlayer.IsUserMuted(sender.LoggedinUser))
- {
- byte[] cantSocialize = PacketBuilder.CreateChat(Messages.PlayerIgnoringYourSocials, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantSocialize);
- break;
- }
-
- if(sender.LoggedinUser.SocializingWith.X != sender.LoggedinUser.X && sender.LoggedinUser.SocializingWith.Y != sender.LoggedinUser.Y)
- {
- byte[] playerNotNearby = PacketBuilder.CreateChat(Messages.SocialPlayerNoLongerNearby, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(playerNotNearby);
- break;
- }
- }
-
-
- if(social.ForEveryone != null)
- {
- foreach (User user in GetUsersAt(sender.LoggedinUser.X, sender.LoggedinUser.Y, true, true))
- {
- if (social.BaseSocialType.Type != "GROUP")
- if (user.Id == sender.LoggedinUser.SocializingWith.Id)
- continue;
-
- if (user.Id == sender.LoggedinUser.Id)
- continue;
-
- if (user.MuteAll || user.MuteSocials)
- continue;
- string socialTarget = "";
- if(sender.LoggedinUser.SocializingWith != null)
- socialTarget = sender.LoggedinUser.SocializingWith.Username;
- byte[] msgEveryone = PacketBuilder.CreateChat(Messages.FormatSocialMessage(social.ForEveryone, socialTarget, sender.LoggedinUser.Username), PacketBuilder.CHAT_BOTTOM_RIGHT);
- user.LoggedinClient.SendPacket(msgEveryone);
- }
-
- }
- if(social.ForTarget != null)
- {
- if(sender.LoggedinUser.SocializingWith != null)
- {
- if (social.BaseSocialType.Type != "GROUP")
- {
- byte[] msgTarget = PacketBuilder.CreateChat(Messages.FormatSocialMessage(social.ForTarget, sender.LoggedinUser.SocializingWith.Username, sender.LoggedinUser.Username), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.LoggedinUser.SocializingWith.LoggedinClient.SendPacket(msgTarget);
- }
- }
- }
- if(social.ForSender != null)
- {
- string socialTarget = "";
- if (sender.LoggedinUser.SocializingWith != null)
- socialTarget = sender.LoggedinUser.SocializingWith.Username;
-
- byte[] msgSender = PacketBuilder.CreateChat(Messages.FormatSocialMessage(social.ForSender, socialTarget, sender.LoggedinUser.Username), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(msgSender);
-
-
- }
-
- if (social.SoundEffect != null)
- {
- foreach (User user in GetUsersAt(sender.LoggedinUser.X, sender.LoggedinUser.Y, true, true))
- {
-
- if (user.MuteAll || user.MuteSocials)
- continue;
-
- byte[] soundEffect = PacketBuilder.CreatePlaysoundPacket(social.SoundEffect);
- user.LoggedinClient.SendPacket(soundEffect);
- }
- }
-
- break;
- default:
- Logger.ErrorPrint(sender.LoggedinUser.Username + " unknown social: " + method.ToString("X") + " packet dump: " + BitConverter.ToString(packet).Replace("-", " "));
- break;
- }
-
- }
- public static void OnBirdMapRequested(GameClient sender, byte[] packet)
- {
- if (!sender.LoggedIn)
- {
- Logger.ErrorPrint(sender.RemoteIp + " Requested Bird Map when not logged in.");
- return;
- }
-
- if(sender.LoggedinUser.Inventory.HasItemId(Item.Telescope))
- {
- byte[] birdMapPacket = PacketBuilder.CreateBirdMap(sender.LoggedinUser.X, sender.LoggedinUser.Y);
- sender.SendPacket(birdMapPacket);
- }
- else
- {
- byte[] noTelescopeMessage = PacketBuilder.CreateChat(Messages.NoTelescope, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(noTelescopeMessage);
- }
- }
-
- public static void OnAuctionPacket(GameClient sender, byte[] packet)
- {
- if (!sender.LoggedIn)
- {
- Logger.ErrorPrint(sender.RemoteIp + " Sent auction packet when not logged in.");
- return;
- }
- if (packet.Length < 4)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid sized auction packet: " + BitConverter.ToString(packet).Replace("-", " "));
- return;
- }
- byte method = packet[1];
- int bidAmount = 0;
- switch (method)
- {
- case PacketBuilder.AUCTION_BID_100:
- bidAmount = 100;
- goto doBids;
- case PacketBuilder.AUCTION_BID_1K:
- bidAmount = 1000;
- goto doBids;
- case PacketBuilder.AUCTION_BID_10K:
- bidAmount = 10000;
- goto doBids;
- case PacketBuilder.AUCTION_BID_100K:
- bidAmount = 100000;
- goto doBids;
- case PacketBuilder.AUCTION_BID_1M:
- bidAmount = 1000000;
- goto doBids;
- case PacketBuilder.AUCTION_BID_10M:
- bidAmount = 10000000;
- goto doBids;
- case PacketBuilder.AUCITON_BID_100M:
- bidAmount = 100000000;
- doBids:;
- if(World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
- {
- World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
- if(tile.Code != null)
- {
- if(tile.Code.StartsWith("AUCTION-"))
- {
- Auction auctionRoom = Auction.GetAuctionRoomById(int.Parse(tile.Code.Split('-')[1]));
- int auctionEntryId = -1;
- string packetStr = Encoding.UTF8.GetString(packet);
- string auctionEntryStr = packetStr.Substring(2, packetStr.Length - 4);
- try
- {
- auctionEntryId = int.Parse(auctionEntryStr);
- }
- catch(FormatException)
- {
- Logger.ErrorPrint("Cant find auciton entry id NaN.");
- break;
- }
- if (!auctionRoom.HasAuctionEntry(auctionEntryId))
- break;
-
- Auction.AuctionEntry entry = auctionRoom.GetAuctionEntry(auctionEntryId);
- entry.Bid(sender.LoggedinUser, bidAmount);
-
- UpdateAreaForAll(tile.X, tile.Y, true, null);
- }
- }
- }
- break;
- default:
- Logger.ErrorPrint("Unknown method id: 0x" + method.ToString("X"));
- break;
-
- }
-
- }
- public static void OnHorseInteraction(GameClient sender, byte[] packet)
- {
- if (!sender.LoggedIn)
- {
- Logger.ErrorPrint(sender.RemoteIp + " Sent horse interaction when not logged in.");
- return;
- }
-
- if(packet.Length < 3)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid sized horse interaction packet: " + BitConverter.ToString(packet).Replace("-", " "));
- return;
- }
-
- byte method = packet[1];
- switch(method)
- {
- case PacketBuilder.HORSE_LIST:
- sender.LoggedinUser.MajorPriority = true;
- byte[] metaTags = PacketBuilder.CreateMetaPacket(Meta.BuildHorseInventory(sender.LoggedinUser));
- sender.SendPacket(metaTags);
- break;
- case PacketBuilder.HORSE_PROFILE:
- byte methodProfileEdit = packet[2];
- if(methodProfileEdit == PacketBuilder.HORSE_PROFILE_EDIT)
- {
- if (sender.LoggedinUser.LastViewedHorse != null)
- {
- sender.LoggedinUser.MajorPriority = true;
- byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildHorseDescriptionEditMeta(sender.LoggedinUser.LastViewedHorse));
- sender.SendPacket(metaPacket);
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + "Trying to edit description of no horse");
- }
- }
- else
- {
- Logger.InfoPrint(BitConverter.ToString(packet).Replace("-", " "));
- }
- break;
- case PacketBuilder.HORSE_FEED:
- int randomId = 0;
- string packetStr = Encoding.UTF8.GetString(packet);
- string randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
- try
- {
- randomId = int.Parse(randomIdStr);
-
- }
- catch (Exception)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
- break;
- }
- if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
- {
- HorseInstance horseFeedInst = sender.LoggedinUser.HorseInventory.GetHorseById(randomId);
-
- sender.LoggedinUser.LastViewedHorse = horseFeedInst;
- sender.LoggedinUser.MajorPriority = true;
- byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildHorseFeedMenu(horseFeedInst, sender.LoggedinUser));
- sender.SendPacket(metaPacket);
- break;
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to feed at a non existant horse.");
- break;
- }
- case PacketBuilder.HORSE_PET:
- randomId = 0;
- packetStr = Encoding.UTF8.GetString(packet);
- randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
- try
- {
- randomId = int.Parse(randomIdStr);
-
- }
- catch (Exception)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
- break;
- }
- if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
- {
- HorseInstance horsePetInst = sender.LoggedinUser.HorseInventory.GetHorseById(randomId);
- sender.LoggedinUser.LastViewedHorse = horsePetInst;
- int randMoodAddition = RandomNumberGenerator.Next(1, 20);
- int randTiredMinus = RandomNumberGenerator.Next(1, 10);
-
-
-
- string msgs = "";
- if (horsePetInst.BasicStats.Mood + randMoodAddition >= 1000)
- {
- msgs += Messages.HorsePetTooHappy;
- }
-
- if (horsePetInst.BasicStats.Tiredness - randTiredMinus <= 0)
- {
- msgs += Messages.HorsePetTooTired;
- }
-
- horsePetInst.BasicStats.Tiredness -= randTiredMinus;
- horsePetInst.BasicStats.Mood += randMoodAddition;
-
- byte[] petMessagePacket = PacketBuilder.CreateChat(Messages.FormatHorsePetMessage(msgs,randMoodAddition, randTiredMinus), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(petMessagePacket);
-
- break;
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to feed at a non existant horse.");
- break;
- }
- case PacketBuilder.HORSE_VET_SERVICE_ALL:
-
- if (World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
- {
- World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
- if(tile.Code != null)
- {
- if (tile.Code.StartsWith("VET-"))
- {
- string[] vetInfo = tile.Code.Split('-');
- int vetId = int.Parse(vetInfo[1]);
- Vet vet = Vet.GetVetById(vetId);
- int price = 0;
-
- foreach (HorseInstance horse in sender.LoggedinUser.HorseInventory.HorseList)
- price += vet.CalculatePrice(horse.BasicStats.Health);
- if (price == 0)
- {
- byte[] notNeededMessagePacket = PacketBuilder.CreateChat(Messages.VetServicesNotNeededAll, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(notNeededMessagePacket);
- break;
- }
- else if (sender.LoggedinUser.Money >= price)
- {
- foreach (HorseInstance horse in sender.LoggedinUser.HorseInventory.HorseList)
- horse.BasicStats.Health = 1000;
-
- byte[] healedMessagePacket = PacketBuilder.CreateChat(Messages.VetAllFullHealthRecoveredMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(healedMessagePacket);
-
- sender.LoggedinUser.TakeMoney(price);
-
- }
- else
- {
- byte[] cannotAffordMessagePacket = PacketBuilder.CreateChat(Messages.VetCannotAffordMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cannotAffordMessagePacket);
- break;
- }
- UpdateArea(sender);
- }
-
- }
- }
- break;
- case PacketBuilder.HORSE_VET_SERVICE:
- randomId = 0;
- packetStr = Encoding.UTF8.GetString(packet);
- randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
-
- if (randomIdStr == "NaN")
- break;
-
- try
- {
- randomId = int.Parse(randomIdStr);
- }
- catch (Exception)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
- break;
- }
- if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
- {
- HorseInstance horseVetServiceInst = sender.LoggedinUser.HorseInventory.GetHorseById(randomId);
- sender.LoggedinUser.LastViewedHorse = horseVetServiceInst;
-
- if(World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
- {
- World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
- if(tile.Code != null)
- {
- if (tile.Code.StartsWith("VET-"))
- {
- string[] vetInfo = tile.Code.Split('-');
- int vetId = int.Parse(vetInfo[1]);
-
- Vet vet = Vet.GetVetById(vetId);
- int price = vet.CalculatePrice(horseVetServiceInst.BasicStats.Health);
- if (sender.LoggedinUser.Money >= price)
- {
- horseVetServiceInst.BasicStats.Health = 1000;
- sender.LoggedinUser.TakeMoney(price);
-
- byte[] messagePacket = PacketBuilder.CreateChat(Messages.FormatVetHorseAtFullHealthMessage(horseVetServiceInst.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(messagePacket);
- }
- else
- {
- byte[] cantAffordMessage = PacketBuilder.CreateChat(Messages.VetCannotAffordMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantAffordMessage);
- break;
- }
- UpdateArea(sender);
- }
-
- }
- }
- break;
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to use vet services on a non existant horse.");
- break;
- }
- case PacketBuilder.HORSE_SHOE_STEEL:
- case PacketBuilder.HORSE_SHOE_IRON:
- randomId = 0;
- packetStr = Encoding.UTF8.GetString(packet);
- randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
-
- if (randomIdStr == "NaN")
- break;
-
- try
- {
- randomId = int.Parse(randomIdStr);
- }
- catch (Exception)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
- break;
- }
- if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
- {
- HorseInstance horseFarrierServiceInst = sender.LoggedinUser.HorseInventory.GetHorseById(randomId);
- sender.LoggedinUser.LastViewedHorse = horseFarrierServiceInst;
-
- if (World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
- {
- World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
- if(tile.Code != null)
- {
- if (tile.Code.StartsWith("FARRIER-"))
- {
- string[] farrierInfo = tile.Code.Split('-');
- int farrierId = int.Parse(farrierInfo[1]);
-
- Farrier farrier = Farrier.GetFarrierById(farrierId);
- int price = 0;
- int incAmount = 0;
- string msg = "";
-
- if (method == PacketBuilder.HORSE_SHOE_STEEL)
- {
- price = farrier.SteelCost;
- incAmount = farrier.SteelShoesAmount;
- msg = Messages.FormatFarrierPutOnSteelShoesMessage(incAmount, 1000);
- }
- else
- {
- price = farrier.IronCost;
- incAmount = farrier.IronShoesAmount;
- msg = Messages.FormatFarrierPutOnIronShoesMessage(incAmount, 1000);
- }
-
- if (sender.LoggedinUser.Money >= price)
- {
- horseFarrierServiceInst.BasicStats.Shoes = incAmount;
- sender.LoggedinUser.TakeMoney(price);
-
- byte[] messagePacket = PacketBuilder.CreateChat(msg, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(messagePacket);
- }
- else
- {
- byte[] cantAffordMessage = PacketBuilder.CreateChat(Messages.FarrierShoesCantAffordMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantAffordMessage);
- break;
- }
- UpdateArea(sender);
- }
-
- }
- }
- break;
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to use farrier services on a non existant horse.");
- break;
- }
- case PacketBuilder.HORSE_SHOE_ALL:
- if (World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
- {
- World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
- if(tile.Code != null)
- {
- if (tile.Code.StartsWith("FARRIER-"))
- {
- string[] farrierInfo = tile.Code.Split('-');
- int farrierId = int.Parse(farrierInfo[1]);
-
- Farrier farrier = Farrier.GetFarrierById(farrierId);
-
- int totalPrice = 0;
- foreach (HorseInstance horse in sender.LoggedinUser.HorseInventory.HorseList)
- {
- if (horse.BasicStats.Shoes < farrier.SteelShoesAmount)
- {
- totalPrice += farrier.SteelCost;
- }
- }
-
- if (sender.LoggedinUser.Money >= totalPrice)
- {
- foreach (HorseInstance horse in sender.LoggedinUser.HorseInventory.HorseList)
- {
- if (horse.BasicStats.Shoes < farrier.SteelShoesAmount)
- {
- horse.BasicStats.Shoes = farrier.SteelShoesAmount;
- }
- }
- sender.LoggedinUser.TakeMoney(totalPrice);
-
- byte[] messagePacket = PacketBuilder.CreateChat(Messages.FormatFarrierPutOnSteelShoesAllMesssage(farrier.SteelShoesAmount, 1000), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(messagePacket);
- }
- else
- {
- byte[] cantAffordMessage = PacketBuilder.CreateChat(Messages.FarrierShoesCantAffordMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantAffordMessage);
- break;
- }
- UpdateArea(sender);
- }
- }
-
- }
- break;
- case PacketBuilder.HORSE_GROOM_SERVICE:
- randomId = 0;
- packetStr = Encoding.UTF8.GetString(packet);
- randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
-
- if (randomIdStr == "NaN")
- break;
-
- try
- {
- randomId = int.Parse(randomIdStr);
- }
- catch (Exception)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
- break;
- }
- if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
- {
- HorseInstance groomHorseInst = sender.LoggedinUser.HorseInventory.GetHorseById(randomId);
- sender.LoggedinUser.LastViewedHorse = groomHorseInst;
-
- if (World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
- {
- World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
- if(tile.Code != null)
- {
- if (tile.Code.StartsWith("GROOMER-"))
- {
- string[] groomerInfo = tile.Code.Split('-');
- int groomerId = int.Parse(groomerInfo[1]);
-
- Groomer groomer = Groomer.GetGroomerById(groomerId);
- int price = groomer.CalculatePrice(groomHorseInst.BasicStats.Groom);
-
-
- if (sender.LoggedinUser.Money >= price)
- {
- groomHorseInst.BasicStats.Groom = groomer.Max;
- sender.LoggedinUser.TakeMoney(price);
-
- byte[] messagePacket = PacketBuilder.CreateChat(Messages.FormatHorseGroomedToBestAbilities(groomHorseInst.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(messagePacket);
- }
- else
- {
- byte[] cantAffordMessage = PacketBuilder.CreateChat(Messages.GroomerCannotAffordMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantAffordMessage);
- break;
- }
- UpdateArea(sender);
- }
-
- }
- }
- break;
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to use groomer services on a non existant horse.");
- break;
- }
- case PacketBuilder.HORSE_GROOM_SERVICE_ALL:
- if (World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
- {
- World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
- if(tile.Code != null)
- {
- if (tile.Code.StartsWith("GROOMER-"))
- {
- string[] groomerInfo = tile.Code.Split('-');
- int groomId = int.Parse(groomerInfo[1]);
- Groomer groomer = Groomer.GetGroomerById(groomId);
- int price = 0;
- int count = 0;
-
- foreach (HorseInstance horse in sender.LoggedinUser.HorseInventory.HorseList)
- {
- if (horse.BasicStats.Groom < groomer.Max)
- {
- price += groomer.CalculatePrice(horse.BasicStats.Groom);
- count++;
- }
- }
- if (count == 0)
- {
- byte[] notNeededMessagePacket = PacketBuilder.CreateChat(Messages.GroomerDontNeed, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(notNeededMessagePacket);
- break;
- }
- else if (sender.LoggedinUser.Money >= price)
- {
- foreach (HorseInstance horse in sender.LoggedinUser.HorseInventory.HorseList)
- if (horse.BasicStats.Groom < groomer.Max)
- horse.BasicStats.Groom = groomer.Max;
-
- byte[] groomedAllHorsesPacket = PacketBuilder.CreateChat(Messages.GroomerBestToHisAbilitiesALL, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(groomedAllHorsesPacket);
-
- sender.LoggedinUser.TakeMoney(price);
-
- }
- else
- {
- byte[] cannotAffordMessagePacket = PacketBuilder.CreateChat(Messages.GroomerCannotAffordMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cannotAffordMessagePacket);
- break;
- }
- UpdateArea(sender);
- }
-
- }
- }
- break;
- case PacketBuilder.HORSE_BARN_SERVICE:
- randomId = 0;
- packetStr = Encoding.UTF8.GetString(packet);
- randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
-
- if (randomIdStr == "NaN")
- break;
-
- try
- {
- randomId = int.Parse(randomIdStr);
- }
- catch (Exception)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
- break;
- }
- if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
- {
- HorseInstance barnHorseInst = sender.LoggedinUser.HorseInventory.GetHorseById(randomId);
- sender.LoggedinUser.LastViewedHorse = barnHorseInst;
-
- if (World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
- {
- World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
- if (tile.Code != null)
- {
- if (tile.Code.StartsWith("BARN-"))
- {
- string[] barnInfo = tile.Code.Split('-');
- int barnId = int.Parse(barnInfo[1]);
-
- Barn barn = Barn.GetBarnById(barnId);
- int price = barn.CalculatePrice(barnHorseInst.BasicStats.Tiredness, barnHorseInst.BasicStats.Hunger, barnHorseInst.BasicStats.Thirst); ;
-
-
- if (sender.LoggedinUser.Money >= price)
- {
- barnHorseInst.BasicStats.Tiredness = 1000;
- barnHorseInst.BasicStats.Hunger = 1000;
- barnHorseInst.BasicStats.Thirst = 1000;
- sender.LoggedinUser.TakeMoney(price);
-
- byte[] messagePacket = PacketBuilder.CreateChat(Messages.FormatBarnHorseFullyFed(barnHorseInst.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(messagePacket);
- }
- else
- {
- byte[] cantAffordMessage = PacketBuilder.CreateChat(Messages.BarnCantAffordService, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantAffordMessage);
- break;
- }
- UpdateArea(sender);
- }
-
- }
- }
- break;
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to use groomer services on a non existant horse.");
- break;
- }
- case PacketBuilder.HORSE_BARN_SERVICE_ALL:
- if (World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
- {
- World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
- if(tile.Code != null)
- {
- if (tile.Code.StartsWith("BARN-"))
- {
- string[] barnInfo = tile.Code.Split('-');
- int barnId = int.Parse(barnInfo[1]);
- Barn barn = Barn.GetBarnById(barnId);
- int totalPrice = 0;
-
- foreach (HorseInstance horse in sender.LoggedinUser.HorseInventory.HorseList)
- {
- int price = barn.CalculatePrice(horse.BasicStats.Tiredness, horse.BasicStats.Hunger, horse.BasicStats.Thirst);
- if (price > 0)
- totalPrice += price;
- }
- if (totalPrice == 0)
- {
- byte[] notNeededMessagePacket = PacketBuilder.CreateChat(Messages.BarnServiceNotNeeded, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(notNeededMessagePacket);
- break;
- }
- else if (sender.LoggedinUser.Money >= totalPrice)
- {
- foreach (HorseInstance horse in sender.LoggedinUser.HorseInventory.HorseList)
- {
- horse.BasicStats.Tiredness = 1000;
- horse.BasicStats.Thirst = 1000;
- horse.BasicStats.Hunger = 1000;
- }
-
- byte[] barnedAllHorsesPacket = PacketBuilder.CreateChat(Messages.BarnAllHorsesFullyFed, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(barnedAllHorsesPacket);
-
- sender.LoggedinUser.TakeMoney(totalPrice);
-
- }
- else
- {
- byte[] cannotAffordMessagePacket = PacketBuilder.CreateChat(Messages.BarnCantAffordService, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cannotAffordMessagePacket);
- break;
- }
- UpdateArea(sender);
- }
-
- }
- }
- break;
- case PacketBuilder.HORSE_TRAIN:
- randomId = 0;
- packetStr = Encoding.UTF8.GetString(packet);
- randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
-
- if (randomIdStr == "NaN")
- break;
-
- try
- {
- randomId = int.Parse(randomIdStr);
- }
- catch (Exception)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
- break;
- }
- if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
- {
- HorseInstance trainHorseInst = sender.LoggedinUser.HorseInventory.GetHorseById(randomId);
- sender.LoggedinUser.LastViewedHorse = trainHorseInst;
-
- if (World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
- {
- World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
- if (tile.Code != null)
- {
- if (tile.Code.StartsWith("TRAINER-"))
- {
- if (trainHorseInst.TrainTimer > 0)
- {
- byte[] trainSuccessfulMessage = PacketBuilder.CreateChat(Messages.FormatTrainerCantTrainAgainIn(trainHorseInst.TrainTimer), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(trainSuccessfulMessage);
- break;
- }
- string[] trainerInfo = tile.Code.Split('-');
- int trainerId = int.Parse(trainerInfo[1]);
-
- Trainer trainer = Trainer.GetTrainerById(trainerId);
-
- if (sender.LoggedinUser.Money >= trainer.MoneyCost)
- {
- sender.LoggedinUser.TakeMoney(trainer.MoneyCost);
- trainHorseInst.BasicStats.Mood -= trainer.MoodCost;
- trainHorseInst.BasicStats.Thirst -= trainer.ThirstCost;
- trainHorseInst.BasicStats.Hunger -= trainer.HungerCost;
-
-
- switch (trainer.ImprovesStat.ToUpper())
- {
- case "SPEED":
- trainHorseInst.AdvancedStats.Speed += trainer.ImprovesAmount;
- break;
- case "STRENGTH":
- trainHorseInst.AdvancedStats.Strength += trainer.ImprovesAmount;
- break;
- case "AGILITY":
- trainHorseInst.AdvancedStats.Agility += trainer.ImprovesAmount;
- break;
- case "ENDURANCE":
- trainHorseInst.AdvancedStats.Endurance += trainer.ImprovesAmount;
- break;
- case "CONFORMATION":
- trainHorseInst.AdvancedStats.Conformation += trainer.ImprovesAmount;
- break;
- default:
- trainHorseInst.AdvancedStats.Speed += trainer.ImprovesAmount;
- break;
- }
- trainHorseInst.BasicStats.Experience += trainer.ExperienceGained;
- if (!sender.LoggedinUser.Subscribed)
- trainHorseInst.TrainTimer = 1440;
- else
- trainHorseInst.TrainTimer = 720;
-
- byte[] trainSuccessfulMessage = PacketBuilder.CreateChat(Messages.FormatTrainedInStatFormat(trainHorseInst.Name, trainer.ImprovesStat), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(trainSuccessfulMessage);
-
-
- sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.Training).Count++;
-
- if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.Training).Count >= 1000)
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(26)); // Pro Trainer
- if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.Training).Count >= 10000)
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(53)); // Top Trainer
-
- UpdateArea(sender);
- }
- else
- {
- byte[] cantAffordPacket = PacketBuilder.CreateChat(Messages.TrainerCantAfford, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantAffordPacket);
- }
-
- }
-
- }
- }
- break;
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to use trauber services on a non existant horse.");
- break;
- }
- case PacketBuilder.HORSE_GIVE_FEED:
- randomId = 0;
- packetStr = Encoding.UTF8.GetString(packet);
- randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
- try
- {
- randomId = int.Parse(randomIdStr);
-
- }
- catch (Exception)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
- break;
- }
- if(sender.LoggedinUser.LastViewedHorse == null)
- {
- Logger.InfoPrint(sender.LoggedinUser.Username + " Tried to feed a non existant horse.");
- break;
- }
- if (sender.LoggedinUser.Inventory.HasItem(randomId))
- {
- InventoryItem item = sender.LoggedinUser.Inventory.GetItemByRandomid(randomId);
- Item.ItemInformation itemInfo = item.ItemInstances[0].GetItemInfo();
- HorseInstance horseInstance = sender.LoggedinUser.LastViewedHorse;
- bool tooMuch = false;
- bool changePersonality = false;
- bool changeInteligence = false;
-
- foreach(Item.Effects effect in itemInfo.Effects)
- {
- switch(effect.EffectsWhat)
- {
- case "HEALTH":
- if (horseInstance.BasicStats.Health + effect.EffectAmount > 1000)
- tooMuch = true;
- horseInstance.BasicStats.Health += effect.EffectAmount;
- break;
- case "HUNGER":
- if (horseInstance.BasicStats.Hunger + effect.EffectAmount > 1000)
- tooMuch = true;
- horseInstance.BasicStats.Hunger += effect.EffectAmount;
- break;
- case "MOOD":
- if (horseInstance.BasicStats.Mood + effect.EffectAmount > 1000)
- tooMuch = true;
- horseInstance.BasicStats.Mood += effect.EffectAmount;
- break;
- case "GROOM":
- if (horseInstance.BasicStats.Groom + effect.EffectAmount > 1000)
- tooMuch = true;
- horseInstance.BasicStats.Groom += effect.EffectAmount;
- break;
- case "SHOES":
- if (horseInstance.BasicStats.Shoes + effect.EffectAmount > 1000)
- tooMuch = true;
- horseInstance.BasicStats.Shoes += effect.EffectAmount;
- break;
- case "THIRST":
- if (horseInstance.BasicStats.Thirst + effect.EffectAmount > 1000)
- tooMuch = true;
- horseInstance.BasicStats.Thirst += effect.EffectAmount;
- break;
- case "TIREDNESS":
- if (horseInstance.BasicStats.Tiredness + effect.EffectAmount > 1000)
- tooMuch = true;
- horseInstance.BasicStats.Tiredness += effect.EffectAmount;
- break;
- case "INTELLIGENCEOFFSET":
- horseInstance.AdvancedStats.Inteligence += effect.EffectAmount;
- changeInteligence = true;
- break;
- case "PERSONALITYOFFSET":
- horseInstance.AdvancedStats.Personality += effect.EffectAmount;
- changePersonality = true;
-
- break;
- case "SPOILED":
- horseInstance.Spoiled += effect.EffectAmount;
- break;
- }
- }
- sender.LoggedinUser.Inventory.Remove(item.ItemInstances[0]);
-
- if(changePersonality)
- {
- byte[] personalityIncreased = PacketBuilder.CreateChat(Messages.HorseFeedPersonalityIncreased, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(personalityIncreased);
- }
- if (changeInteligence)
- {
- byte[] inteligenceIncreased = PacketBuilder.CreateChat(Messages.HorseFeedInteligenceIncreased, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(inteligenceIncreased);
- }
-
- if(item.ItemId == Item.MagicDroplet)
- {
- string oldColor = horseInstance.Color;
- string newColor = horseInstance.Breed.Colors[RandomNumberGenerator.Next(0, horseInstance.Breed.Colors.Length)];
-
- horseInstance.Color = newColor;
- horseInstance.MagicUsed++;
-
- byte[] magicDropletUsed = PacketBuilder.CreateChat(Messages.FormatHorseFeedMagicDropletUsed(oldColor, newColor), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(magicDropletUsed);
- }
-
- if(item.ItemId == Item.MagicBean)
- {
- double oldH = HorseInfo.CalculateHands(horseInstance.AdvancedStats.Height, false);
- int newHeight = RandomNumberGenerator.Next(horseInstance.Breed.BaseStats.MinHeight, horseInstance.Breed.BaseStats.MaxHeight+1);
- double newH = HorseInfo.CalculateHands(newHeight, false);
-
- horseInstance.AdvancedStats.Height = newHeight;
- horseInstance.MagicUsed++;
-
- byte[] magicBeansUsed = PacketBuilder.CreateChat(Messages.FormatHorseFeedMagicBeanUsed(oldH, newH), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(magicBeansUsed);
- }
-
- byte[] horseNeighThanksPacket = PacketBuilder.CreateChat(Messages.HorseNeighsThanks, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(horseNeighThanksPacket);
-
- if (tooMuch)
- {
- byte[] horseCouldntFinishItAll = PacketBuilder.CreateChat(Messages.HorseCouldNotFinish, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(horseCouldntFinishItAll);
- }
-
- sender.LoggedinUser.MajorPriority = true;
- byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildHorseFeedMenu(sender.LoggedinUser.LastViewedHorse, sender.LoggedinUser));
- sender.SendPacket(metaPacket);
-
-
- break;
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to feed a non existant item to a horse.");
- break;
- }
- case PacketBuilder.HORSE_ENTER_ARENA:
- randomId = 0;
- packetStr = Encoding.UTF8.GetString(packet);
- randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
- try
- {
- randomId = int.Parse(randomIdStr);
-
- }
- catch (Exception)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
- break;
- }
- if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
- {
- HorseInstance horseInstance = sender.LoggedinUser.HorseInventory.GetHorseById(randomId);
- if(World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
- {
- World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
- if(tile.Code != null)
- {
- if (tile.Code.StartsWith("ARENA-"))
- {
- string[] arenaInfo = tile.Code.Split('-');
- int arenaId = int.Parse(arenaInfo[1]);
- Arena arena = Arena.GetAreaById(arenaId);
- if (!Arena.UserHasEnteredHorseInAnyArena(sender.LoggedinUser))
- {
- if (horseInstance.BasicStats.Thirst <= 200)
- {
- byte[] tooThirsty = PacketBuilder.CreateChat(Messages.ArenaTooThirsty, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(tooThirsty);
- break;
- }
- else if (horseInstance.BasicStats.Hunger <= 200)
- {
- byte[] tooHungry = PacketBuilder.CreateChat(Messages.ArenaTooHungry, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(tooHungry);
- break;
- }
- else if (horseInstance.BasicStats.Shoes <= 200)
- {
- byte[] needsFarrier = PacketBuilder.CreateChat(Messages.ArenaNeedsFarrier, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(needsFarrier);
- break;
- }
- else if (horseInstance.BasicStats.Tiredness <= 200)
- {
- byte[] tooTired = PacketBuilder.CreateChat(Messages.ArenaTooTired, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(tooTired);
- break;
- }
- else if (horseInstance.BasicStats.Health <= 200)
- {
- byte[] needsVet = PacketBuilder.CreateChat(Messages.ArenaNeedsVet, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(needsVet);
- break;
- }
-
-
-
- if (sender.LoggedinUser.Money >= arena.EntryCost)
- {
- arena.AddEntry(sender.LoggedinUser, horseInstance);
- break;
- }
- else
- {
- byte[] cantAffordEntryFee = PacketBuilder.CreateChat(Messages.ArenaCantAfford, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantAffordEntryFee);
- break;
- }
- }
- else
- {
- byte[] allreadyEntered = PacketBuilder.CreateChat(Messages.ArenaAlreadyEntered, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(allreadyEntered);
- }
- }
-
- }
- }
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to enter a non existant horse into a competition.");
- break;
- }
- break;
- case PacketBuilder.HORSE_RELEASE:
- randomId = 0;
- packetStr = Encoding.UTF8.GetString(packet);
- randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
- try
- {
- randomId = int.Parse(randomIdStr);
-
- }
- catch (Exception)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
- break;
- }
- if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
- {
- if(World.InTown(sender.LoggedinUser.X, sender.LoggedinUser.Y))
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to reelease a horse while inside a town....");
- break;
- }
-
-
- HorseInstance horseReleaseInst = sender.LoggedinUser.HorseInventory.GetHorseById(randomId);
- if(sender.LoggedinUser.CurrentlyRidingHorse != null)
- {
- if(horseReleaseInst.RandomId == sender.LoggedinUser.CurrentlyRidingHorse.RandomId)
- {
- byte[] errorChatPacket = PacketBuilder.CreateChat(Messages.HorseCantReleaseTheHorseYourRidingOn, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(errorChatPacket);
- break;
- }
-
- }
-
- if (horseReleaseInst.Description == "")
- horseReleaseInst.Description += Messages.FormatHorseReleasedBy(sender.LoggedinUser.Username);
-
- Logger.InfoPrint(sender.LoggedinUser.Username + " RELEASED HORSE: " + horseReleaseInst.Name + " (a " + horseReleaseInst.Breed.Name + ").");
-
- sender.LoggedinUser.HorseInventory.DeleteHorse(horseReleaseInst);
- new WildHorse(horseReleaseInst, sender.LoggedinUser.X, sender.LoggedinUser.Y, 60, true);
-
- sender.LoggedinUser.LastViewedHorse = horseReleaseInst;
- sender.LoggedinUser.MajorPriority = true;
- byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildHorseReleased());
- sender.SendPacket(metaPacket);
- break;
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to release at a non existant horse.");
- break;
- }
- case PacketBuilder.HORSE_TACK:
- randomId = 0;
- packetStr = Encoding.UTF8.GetString(packet);
- randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
- try
- {
- randomId = int.Parse(randomIdStr);
-
- }
- catch (Exception)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
- break;
- }
- if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
- {
- HorseInstance horseTackInst = sender.LoggedinUser.HorseInventory.GetHorseById(randomId);
-
- sender.LoggedinUser.LastViewedHorse = horseTackInst;
- sender.LoggedinUser.MajorPriority = true;
- byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildTackMenu(horseTackInst, sender.LoggedinUser));
- sender.SendPacket(metaPacket);
- break;
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to tack at a non existant horse.");
- break;
- }
- case PacketBuilder.HORSE_DRINK:
- if(World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
- {
- World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
- if(tile.Code != "POND")
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to drink from a pond when not on one.");
- break;
- }
- }
-
- randomId = 0;
- packetStr = Encoding.UTF8.GetString(packet);
- randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
- try
- {
- randomId = int.Parse(randomIdStr);
-
- }
- catch (Exception)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
- break;
- }
- if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
- {
- HorseInstance horseDrinkInst = sender.LoggedinUser.HorseInventory.GetHorseById(randomId);
-
- if(horseDrinkInst.BasicStats.Health < 200)
- {
- byte[] hpToLow = PacketBuilder.CreateChat(Messages.FormatPondHpLowMessage(horseDrinkInst.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(hpToLow);
- break;
- }
-
- if(horseDrinkInst.BasicStats.Thirst < 1000)
- {
- horseDrinkInst.BasicStats.Thirst = 1000;
- byte[] drinkFull = PacketBuilder.CreateChat(Messages.FormatPondDrinkFull(horseDrinkInst.Name),PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(drinkFull);
-
- if(RandomNumberGenerator.Next(0, 100) < 25)
- {
- horseDrinkInst.BasicStats.Health -= 200;
- byte[] ohNoes = PacketBuilder.CreateChat(Messages.FormatPondDrinkOhNoes(horseDrinkInst.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(ohNoes);
- }
-
- UpdateArea(sender);
- }
- else
- {
- byte[] notThirsty = PacketBuilder.CreateChat(Messages.FormatPondNotThirsty(horseDrinkInst.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(notThirsty);
- break;
- }
- break;
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to tack at a non existant horse.");
- break;
- }
- case PacketBuilder.HORSE_TACK_EQUIP:
-
- int itemId = 0;
- packetStr = Encoding.UTF8.GetString(packet);
- string itemIdStr = packetStr.Substring(2, packetStr.Length - 4);
- try
- {
- itemId = int.Parse(itemIdStr);
- }
- catch (Exception)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
- break;
- }
- if(Item.ItemIdExist(itemId))
- {
- if(sender.LoggedinUser.LastViewedHorse != null)
- {
- if(sender.LoggedinUser.LastViewedHorse.AutoSell > 0)
- {
- byte[] failMessagePacket = PacketBuilder.CreateChat(Messages.HorseTackFailAutoSell, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(failMessagePacket);
- break;
- }
-
- if(sender.LoggedinUser.Inventory.HasItemId(itemId))
- {
- Item.ItemInformation itemInfo = Item.GetItemById(itemId);
- if (itemInfo.Type == "TACK")
- {
- switch (itemInfo.GetMiscFlag(0))
- {
- case 1: // Saddle
- if(sender.LoggedinUser.LastViewedHorse.Equipment.Saddle != null)
- sender.LoggedinUser.Inventory.AddIgnoringFull(new ItemInstance(sender.LoggedinUser.LastViewedHorse.Equipment.Saddle.Id));
- Database.SetSaddle(sender.LoggedinUser.LastViewedHorse.RandomId, itemInfo.Id);
- sender.LoggedinUser.LastViewedHorse.Equipment.Saddle = itemInfo;
- break;
- case 2: // Saddle Pad
- if (sender.LoggedinUser.LastViewedHorse.Equipment.SaddlePad != null)
- sender.LoggedinUser.Inventory.AddIgnoringFull(new ItemInstance(sender.LoggedinUser.LastViewedHorse.Equipment.SaddlePad.Id));
- Database.SetSaddlePad(sender.LoggedinUser.LastViewedHorse.RandomId, itemInfo.Id);
- sender.LoggedinUser.LastViewedHorse.Equipment.SaddlePad = itemInfo;
- break;
- case 3: // Bridle
- if (sender.LoggedinUser.LastViewedHorse.Equipment.Bridle != null)
- sender.LoggedinUser.Inventory.AddIgnoringFull(new ItemInstance(sender.LoggedinUser.LastViewedHorse.Equipment.Bridle.Id));
- Database.SetBridle(sender.LoggedinUser.LastViewedHorse.RandomId, itemInfo.Id);
- sender.LoggedinUser.LastViewedHorse.Equipment.Bridle = itemInfo;
- break;
- }
-
-
- sender.LoggedinUser.Inventory.Remove(sender.LoggedinUser.Inventory.GetItemByItemId(itemId).ItemInstances[0]); // Remove item from inventory.
-
- sender.LoggedinUser.MajorPriority = true;
- byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildTackMenu(sender.LoggedinUser.LastViewedHorse, sender.LoggedinUser));
- sender.SendPacket(metaPacket);
-
- byte[] equipMsgPacket = PacketBuilder.CreateChat(Messages.FormatEquipTackMessage(itemInfo.Name, sender.LoggedinUser.LastViewedHorse.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(equipMsgPacket);
-
- }
- else if(itemInfo.Type == "COMPANION")
- {
- if (sender.LoggedinUser.LastViewedHorse.Equipment.Companion != null)
- sender.LoggedinUser.Inventory.AddIgnoringFull(new ItemInstance(sender.LoggedinUser.LastViewedHorse.Equipment.Companion.Id));
- Database.SetCompanion(sender.LoggedinUser.LastViewedHorse.RandomId, itemInfo.Id);
- sender.LoggedinUser.LastViewedHorse.Equipment.Companion = itemInfo;
-
- sender.LoggedinUser.Inventory.Remove(sender.LoggedinUser.Inventory.GetItemByItemId(itemId).ItemInstances[0]); // Remove item from inventory.
-
- sender.LoggedinUser.MajorPriority = true;
- byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildHorseCompanionEquipMenu(sender.LoggedinUser.LastViewedHorse, sender.LoggedinUser));
- sender.SendPacket(metaPacket);
-
- byte[] equipMsgPacket = PacketBuilder.CreateChat(Messages.FormatHorseCompanionEquipMessage(sender.LoggedinUser.LastViewedHorse.Name, itemInfo.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(equipMsgPacket);
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to equip a tack item to a hrose but that item was not of type \"TACK\".");
- }
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " tried to equip tack he doesnt have");
- break;
- }
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to equip tack to a horse when not viewing one.");
- break;
- }
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " tried to equip tack he doesnt exist");
- break;
- }
-
- break;
- case PacketBuilder.HORSE_TACK_UNEQUIP:
- if (sender.LoggedinUser.LastViewedHorse != null)
- {
- byte equipSlot = packet[2];
- switch(equipSlot)
- {
- case 0x31: // Saddle
- if (sender.LoggedinUser.LastViewedHorse.Equipment.Saddle != null)
- sender.LoggedinUser.Inventory.AddIgnoringFull(new ItemInstance(sender.LoggedinUser.LastViewedHorse.Equipment.Saddle.Id));
- Database.ClearSaddle(sender.LoggedinUser.LastViewedHorse.RandomId);
- sender.LoggedinUser.LastViewedHorse.Equipment.Saddle = null;
- break;
- case 0x32: // Saddle Pad
- if (sender.LoggedinUser.LastViewedHorse.Equipment.SaddlePad != null)
- sender.LoggedinUser.Inventory.AddIgnoringFull(new ItemInstance(sender.LoggedinUser.LastViewedHorse.Equipment.SaddlePad.Id));
- Database.ClearSaddlePad(sender.LoggedinUser.LastViewedHorse.RandomId);
- sender.LoggedinUser.LastViewedHorse.Equipment.SaddlePad = null;
- break;
- case 0x33: // Bridle
- if (sender.LoggedinUser.LastViewedHorse.Equipment.Bridle != null)
- sender.LoggedinUser.Inventory.AddIgnoringFull(new ItemInstance(sender.LoggedinUser.LastViewedHorse.Equipment.Bridle.Id));
- Database.ClearBridle(sender.LoggedinUser.LastViewedHorse.RandomId);
- sender.LoggedinUser.LastViewedHorse.Equipment.Bridle = null;
- break;
- case 0x34: // Companion
- if (sender.LoggedinUser.LastViewedHorse.Equipment.Companion != null)
- sender.LoggedinUser.Inventory.AddIgnoringFull(new ItemInstance(sender.LoggedinUser.LastViewedHorse.Equipment.Companion.Id));
- Database.ClearCompanion(sender.LoggedinUser.LastViewedHorse.RandomId);
- sender.LoggedinUser.LastViewedHorse.Equipment.Companion = null;
- goto companionRemove;
- default:
- Logger.ErrorPrint("Unknown equip slot: " + equipSlot.ToString("X"));
- break;
- }
- byte[] itemUnequipedMessage = PacketBuilder.CreateChat(Messages.FormatUnEquipTackMessage(sender.LoggedinUser.LastViewedHorse.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(itemUnequipedMessage);
-
- if(sender.LoggedinUser.CurrentlyRidingHorse != null)
- {
- if(sender.LoggedinUser.CurrentlyRidingHorse.RandomId == sender.LoggedinUser.LastViewedHorse.RandomId)
- {
- byte[] disMounted = PacketBuilder.CreateChat(Messages.FormatHorseDismountedBecauseTackedMessage(sender.LoggedinUser.CurrentlyRidingHorse.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.LoggedinUser.Facing %= 5;
- sender.LoggedinUser.CurrentlyRidingHorse = null;
- sender.SendPacket(disMounted);
- }
- }
-
- sender.LoggedinUser.MajorPriority = true;
- byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildTackMenu(sender.LoggedinUser.LastViewedHorse, sender.LoggedinUser));
- sender.SendPacket(metaPacket);
- break;
- companionRemove:;
- itemUnequipedMessage = PacketBuilder.CreateChat(Messages.FormatHorseCompanionRemoveMessage(sender.LoggedinUser.LastViewedHorse.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(itemUnequipedMessage);
-
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildHorseCompanionEquipMenu(sender.LoggedinUser.LastViewedHorse, sender.LoggedinUser));
- sender.SendPacket(metaPacket);
- break;
-
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to unequip items from non existnat horse");
- }
- break;
- case PacketBuilder.HORSE_DISMOUNT:
- randomId = 0;
- packetStr = Encoding.UTF8.GetString(packet);
- randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
-
- if(randomIdStr == "") // F7 Shortcut
- {
- if(sender.LoggedinUser.CurrentlyRidingHorse != null)
- {
-
- byte[] stopRidingHorseMessagePacket = PacketBuilder.CreateChat(Messages.HorseStopRidingMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(stopRidingHorseMessagePacket);
-
- StopRidingHorse(sender);
- }
- else
- {
- if(sender.LoggedinUser.HorseInventory.HorseIdExist(sender.LoggedinUser.LastRiddenHorse))
- StartRidingHorse(sender, sender.LoggedinUser.LastRiddenHorse);
- }
- break;
- }
-
- try
- {
- randomId = int.Parse(randomIdStr);
-
- }
- catch (Exception)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
- break;
- }
- if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
- {
-
- byte[] stopRidingHorseMessagePacket = PacketBuilder.CreateChat(Messages.HorseStopRidingMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(stopRidingHorseMessagePacket);
-
- StopRidingHorse(sender);
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to dismount at a non existant horse.");
- break;
- }
- break;
- case PacketBuilder.HORSE_MOUNT:
- randomId = 0;
- packetStr = Encoding.UTF8.GetString(packet);
- randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
- try
- {
- randomId = int.Parse(randomIdStr);
-
- }
- catch (Exception)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
- break;
- }
- if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
- {
- StartRidingHorse(sender, randomId);
- break;
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to mount at a non existant horse.");
- break;
- }
- case PacketBuilder.HORSE_LOOK:
- randomId = 0;
- packetStr = Encoding.UTF8.GetString(packet);
- randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
- HorseInstance horseInst;
- try
- {
- randomId = int.Parse(randomIdStr);
-
- }
- catch (Exception)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
- return;
- }
- if(sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
- {
- horseInst = sender.LoggedinUser.HorseInventory.GetHorseById(randomId);
- UpdateHorseMenu(sender, horseInst);
- }
- else
- {
- try
- { // Not your horse? possibly viewed inside a ranch?
- horseInst = Database.GetPlayerHorse(randomId);
- UpdateHorseMenu(sender, horseInst);
- break;
- }
- catch(Exception)
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to look at a non existant horse.");
- break;
- }
- }
-
- break;
- case PacketBuilder.HORSE_ESCAPE:
- if(WildHorse.DoesHorseExist(sender.LoggedinUser.CapturingHorseId))
- {
- WildHorse capturing = WildHorse.GetHorseById(sender.LoggedinUser.CapturingHorseId);
- sender.LoggedinUser.CapturingHorseId = 0;
-
- if (capturing.X == sender.LoggedinUser.X && capturing.Y == sender.LoggedinUser.Y)
- {
- capturing.Escape();
- Logger.InfoPrint(sender.LoggedinUser.Username + " Failed to capture: " + capturing.Instance.Breed.Name + " new location: " + capturing.X + ", " + capturing.Y);
-
- }
- }
- sender.LoggedinUser.MajorPriority = true;
- byte[] hoseEscaped = PacketBuilder.CreateMetaPacket(Meta.BuildHorseEscapedMessage());
- sender.SendPacket(hoseEscaped);
- break;
- case PacketBuilder.HORSE_CAUGHT:
- if (WildHorse.DoesHorseExist(sender.LoggedinUser.CapturingHorseId))
- {
- WildHorse capturing = WildHorse.GetHorseById(sender.LoggedinUser.CapturingHorseId);
- sender.LoggedinUser.CapturingHorseId = 0;
-
- if (capturing.X == sender.LoggedinUser.X && capturing.Y == sender.LoggedinUser.Y)
- {
- try
- {
- capturing.Capture(sender.LoggedinUser);
- }
- catch (InventoryFullException)
- {
- byte[] chatMsg = PacketBuilder.CreateChat(Messages.TooManyHorses, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatMsg);
- break;
- }
-
- sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.HorseCapture).Count++;
-
- if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.HorseCapture).Count >= 100)
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(24)); // Wrangler
- if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.HorseCapture).Count >= 1000)
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(25)); // Pro Wrangler
-
- Logger.InfoPrint(sender.LoggedinUser.Username + " Captured a: " + capturing.Instance.Breed.Name);
-
- sender.LoggedinUser.MajorPriority = true;
- byte[] horseCaught = PacketBuilder.CreateMetaPacket(Meta.BuildHorseCaughtMessage());
- sender.SendPacket(horseCaught);
-
- break;
- }
- }
- sender.LoggedinUser.MajorPriority = true;
- byte[] horseAllreadyCaught = PacketBuilder.CreateMetaPacket(Meta.BuildHorseEscapedAnyway());
- sender.SendPacket(horseAllreadyCaught);
- break;
- case PacketBuilder.HORSE_TRY_CAPTURE:
- randomId = 0;
- packetStr = Encoding.UTF8.GetString(packet);
- randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
- try
- {
- randomId = int.Parse(randomIdStr);
-
- }
- catch (Exception)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
- return;
- }
- if (!WildHorse.DoesHorseExist(randomId))
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to catch a horse that doesnt exist.");
- return;
- }
-
- if(sender.LoggedinUser.HorseInventory.HorseList.Length >= sender.LoggedinUser.MaxHorses)
- {
- byte[] caughtTooManyHorses = PacketBuilder.CreateChat(Messages.HorseCatchTooManyHorsesMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(caughtTooManyHorses);
- return;
- }
-
- sender.LoggedinUser.CapturingHorseId = randomId;
- byte[] chatPacket = PacketBuilder.CreateChat(Messages.HorseCaptureTimer, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatPacket);
- byte[] swfModulePacket = PacketBuilder.CreateSwfModulePacket("catchhorse", PacketBuilder.PACKET_SWF_MODULE_FORCE);
- sender.SendPacket(swfModulePacket);
-
- break;
- default:
- Logger.DebugPrint("Unknown horse packet: " + BitConverter.ToString(packet).Replace("-", " "));
- break;
- }
- }
-
- public static void OnDynamicInputReceived(GameClient sender, byte[] packet)
- {
- if (!sender.LoggedIn)
- {
- Logger.ErrorPrint(sender.RemoteIp + " Sent dyamic input when not logged in.");
- return;
- }
- string packetStr = Encoding.UTF8.GetString(packet);
- string dynamicInputStr = packetStr.Substring(1, packetStr.Length - 3);
- if(dynamicInputStr.Contains("|"))
- {
- string[] dynamicInput = dynamicInputStr.Split('|');
- if(dynamicInput.Length >= 1)
- {
- int inputId = 0;
- try
- {
- inputId = int.Parse(dynamicInput[0]);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input ");
- return;
- }
-
- switch(inputId)
- {
- case 1: // Bank
- if (dynamicInput.Length >= 2)
- {
- Int64 moneyDeposited = 0;
- Int64 moneyWithdrawn = 0;
- try
- {
- moneyDeposited = Int64.Parse(dynamicInput[1]);
- moneyWithdrawn = Int64.Parse(dynamicInput[2]);
- }
- catch (Exception)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to deposit/witthdraw NaN money....");
- UpdateArea(sender);
- break;
- }
-
- // Check if trying to deposit more than can be held in the bank.
-
- if (Convert.ToInt64(sender.LoggedinUser.BankMoney) + moneyDeposited > 9999999999)
- {
- byte[] chatPacket = PacketBuilder.CreateChat(Messages.BankCantHoldThisMuch, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatPacket);
- UpdateArea(sender);
- break;
- }
-
- // Check if trying to deposit more than 2.1B
-
- if (moneyWithdrawn > 2100000000)
- {
- byte[] chatPacket = PacketBuilder.CreateChat(Messages.BankYouCantHoldThisMuch, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatPacket);
- UpdateArea(sender);
- break;
- }
-
-
-
- if((moneyDeposited <= sender.LoggedinUser.Money) && moneyDeposited != 0)
- {
- sender.LoggedinUser.TakeMoney(Convert.ToInt32(moneyDeposited));
- sender.LoggedinUser.BankMoney += moneyDeposited;
-
- byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatDepositedMoneyMessage(Convert.ToInt32(moneyDeposited)), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatPacket);
- }
-
- if ((moneyWithdrawn <= sender.LoggedinUser.BankMoney) && moneyWithdrawn != 0)
- {
- sender.LoggedinUser.BankMoney -= moneyWithdrawn;
- sender.LoggedinUser.AddMoney(Convert.ToInt32(moneyWithdrawn));
-
- byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatWithdrawMoneyMessage(Convert.ToInt32(moneyWithdrawn)), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatPacket);
- }
-
- UpdateArea(sender);
- break;
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (private notes, wrong size)");
- break;
- }
- case 2: // Send Mail
- if(dynamicInput.Length >= 4)
- {
- string to = dynamicInput[1];
- string subject = dynamicInput[2];
- string message = dynamicInput[3];
-
- if(sender.LoggedinUser.Money >= 3)
- {
- if(Database.CheckUserExist(to))
- {
- int playerId = Database.GetUserid(to);
-
- sender.LoggedinUser.TakeMoney(3);
- Mailbox.Mail mailMessage = new Mailbox.Mail();
- mailMessage.RandomId = RandomID.NextRandomId();
- mailMessage.FromUser = sender.LoggedinUser.Id;
- mailMessage.ToUser = playerId;
- mailMessage.Timestamp = Convert.ToInt32((DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds);
- mailMessage.Read = false;
- mailMessage.Subject = subject;
- mailMessage.Message = message;
-
- if(IsUserOnline(playerId))
- {
- User user = GetUserById(playerId);
- user.MailBox.AddMail(mailMessage);
-
- byte[] BaseStatsPacketData = PacketBuilder.CreatePlayerData(user.Money, GameServer.GetNumberOfPlayers(), user.MailBox.UnreadMailCount);
- user.LoggedinClient.SendPacket(BaseStatsPacketData);
- }
- else
- {
- Database.AddMail(mailMessage.RandomId, mailMessage.ToUser, mailMessage.FromUser, mailMessage.Subject, mailMessage.Message, mailMessage.Timestamp, mailMessage.Read);
- }
-
- byte[] mailMessageSent = PacketBuilder.CreateChat(Messages.FormatCityHallSendMailMessage(to.ToLower()),PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(mailMessageSent);
-
- UpdateArea(sender);
- }
- else
- {
- byte[] userDontExistFormat = PacketBuilder.CreateChat(Messages.FormatCityHallCantFindPlayerMessage(to), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(userDontExistFormat);
- }
- }
-
- }
- break;
- case 3: // Add Item or Money to Trade
- {
- if (dynamicInput.Length >= 2)
- {
- if(sender.LoggedinUser.AttemptingToOfferItem == -1) // Money
- {
- string answer = dynamicInput[1];
- int amountMoney = -1;
- try
- {
- amountMoney = int.Parse(answer);
- }
- catch (Exception)
- {
- byte[] tooMuchMoney = PacketBuilder.CreateChat(Messages.TradeMoneyOfferTooMuch, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(tooMuchMoney);
- break;
- }
- if(amountMoney < 0)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to trade less than 0$");
- }
- if(amountMoney >= sender.LoggedinUser.Money)
- {
- byte[] tooMuchMoney = PacketBuilder.CreateChat(Messages.TradeMoneyOfferTooMuch, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(tooMuchMoney);
- break;
- }
-
- sender.LoggedinUser.TradingWith.MoneyOffered = amountMoney;
-
- UpdateArea(sender);
- if(sender.LoggedinUser.TradingWith != null)
- if (!sender.LoggedinUser.TradingWith.OtherTrade.Trader.TradeMenuPriority)
- UpdateArea(sender.LoggedinUser.TradingWith.OtherTrade.Trader.LoggedinClient);
- break;
- }
-
-
-
- if (Item.ItemIdExist(sender.LoggedinUser.AttemptingToOfferItem))
- {
- string answer = dynamicInput[1];
- int itemCount = -1;
- try
- {
- itemCount = int.Parse(answer);
- }
- catch(FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (Item TRADE, id is NaN)");
- }
-
- InventoryItem item = sender.LoggedinUser.Inventory.GetItemByItemId(sender.LoggedinUser.AttemptingToOfferItem);
-
- if (itemCount <= 0)
- {
- byte[] MustBeAtleast1 = PacketBuilder.CreateChat(Messages.TradeItemOfferAtleast1, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(MustBeAtleast1);
- break;
- }
- if(itemCount > item.ItemInstances.Length)
- {
- byte[] TooMuchItems = PacketBuilder.CreateChat(Messages.FormatTradeItemOfferTooMuch(item.ItemInstances.Length, itemCount), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(TooMuchItems);
- break;
- }
-
- foreach(ItemInstance[] existingItems in sender.LoggedinUser.TradingWith.ItemsOffered)
- {
- if(existingItems[0].ItemId == sender.LoggedinUser.AttemptingToOfferItem)
- {
- sender.LoggedinUser.TradingWith.RemoveOfferedItems(existingItems);
- break;
- }
- }
-
-
-
- ItemInstance[] items = new ItemInstance[itemCount];
- for (int i = 0; i < itemCount; i++)
- {
- items[i] = item.ItemInstances[i];
- }
- sender.LoggedinUser.TradingWith.OfferItems(items);
-
- UpdateArea(sender);
- if (sender.LoggedinUser.TradingWith != null)
- if (!sender.LoggedinUser.TradingWith.OtherTrade.Trader.TradeMenuPriority)
- UpdateArea(sender.LoggedinUser.TradingWith.OtherTrade.Trader.LoggedinClient);
- }
- break;
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (Item TRADE, wrong size)");
- break;
- }
- }
- case 6: // Riddle Room
- if (dynamicInput.Length >= 2)
- {
- if (sender.LoggedinUser.LastRiddle != null)
- {
- string answer = dynamicInput[1];
- if(sender.LoggedinUser.LastRiddle.CheckAnswer(sender.LoggedinUser, answer))
- sender.LoggedinUser.LastRiddle = null;
- UpdateArea(sender);
- }
- break;
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (LastRiddle, wrong size)");
- break;
- }
- case 5: // Horse Description
- if (dynamicInput.Length >= 3)
- {
- if(sender.LoggedinUser.LastViewedHorse != null)
- {
- string desc = dynamicInput[2];
- string name = dynamicInput[1];
- name.Trim();
- desc.Trim();
-
- if(name.Length > 50)
- {
- byte[] horseNameTooLongPacket = PacketBuilder.CreateChat(Messages.HorseNameTooLongError, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(horseNameTooLongPacket);
- break;
- }
-
- if (desc.Length > 250)
- {
- byte[] horseNameTooLongPacket = PacketBuilder.CreateChat(Messages.HorseNameTooLongError, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(horseNameTooLongPacket);
- break;
- }
-
- object filterReason = Chat.FilterMessage(name);
- if (filterReason != null)
- {
- byte[] msg = PacketBuilder.CreateChat(Messages.HorseNameViolationsError, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(msg);
- return;
- }
-
- filterReason = Chat.FilterMessage(desc);
- if (filterReason != null)
- {
- Chat.Reason reason = (Chat.Reason)filterReason;
- byte[] msg = PacketBuilder.CreateChat(Messages.FormatHorseProfileBlocked(reason.Message), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(msg);
- return;
- }
-
- sender.LoggedinUser.MajorPriority = true;
- sender.LoggedinUser.LastViewedHorse.Name = dynamicInput[1];
- sender.LoggedinUser.LastViewedHorse.Description = dynamicInput[2];
- byte[] horseProfileSavedPacket = PacketBuilder.CreateChat(Messages.FormatHorseSavedProfileMessage(sender.LoggedinUser.LastViewedHorse.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(horseProfileSavedPacket);
- UpdateHorseMenu(sender, sender.LoggedinUser.LastViewedHorse);
- }
- break;
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (NPC Search, wrong size)");
- break;
- }
- case 4: // NPC Search
- if(dynamicInput.Length >= 2)
- {
- sender.LoggedinUser.MajorPriority = true;
- string metaWindow = Meta.BuildNpcSearch(dynamicInput[1]);
- byte[] metaPacket = PacketBuilder.CreateMetaPacket(metaWindow);
- sender.SendPacket(metaPacket);
- break;
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (NPC Search, wrong size)");
- break;
- }
- case 7: // Private Notes
- if (dynamicInput.Length >= 2)
- {
- sender.LoggedinUser.PrivateNotes = dynamicInput[1];
- UpdateStats(sender);
- byte[] chatPacket = PacketBuilder.CreateChat(Messages.PrivateNotesSavedMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatPacket);
- break;
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (private notes, wrong size)");
- break;
- }
- case 10: // Change auto sell price
- if (dynamicInput.Length >= 2)
- {
- if (sender.LoggedinUser.LastViewedHorse != null)
- {
- sender.LoggedinUser.MajorPriority = true;
- HorseInstance horseInstance = sender.LoggedinUser.LastViewedHorse;
- int newSellPrice = 0;
- try
- {
- newSellPrice = int.Parse(dynamicInput[1]);
- }
- catch (Exception)
- {
- newSellPrice = 2147483647; // too high
- }
-
- if(newSellPrice > 500000000 || newSellPrice < 0)
- {
- byte[] priceTooHigh = PacketBuilder.CreateChat(Messages.HorseAutoSellValueTooHigh, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(priceTooHigh);
- break;
- }
- byte[] sellPricePacket;
- if (newSellPrice > 0)
- sellPricePacket = PacketBuilder.CreateChat(Messages.FormatAutoSellConfirmedMessage(newSellPrice), PacketBuilder.CHAT_BOTTOM_RIGHT);
- else
- sellPricePacket = PacketBuilder.CreateChat(Messages.HorseAutoSellRemoved, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(sellPricePacket);
- horseInstance.AutoSell = newSellPrice;
-
- UpdateHorseMenu(sender, sender.LoggedinUser.LastViewedHorse);
- }
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (autosell, wrong size)");
- break;
- }
- break;
- case 11: // Ranch Description Edit
- if (dynamicInput.Length >= 2)
- {
- string title = dynamicInput[1];
- string desc = dynamicInput[2];
- if(sender.LoggedinUser.OwnedRanch != null)
- {
- title.Trim();
- desc.Trim();
- if(title.Length > 100)
- {
- byte[] tooLongPacket = PacketBuilder.CreateChat(Messages.RanchSavedTitleTooLongError, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(tooLongPacket);
- break;
- }
- if (desc.Length > 4000)
- {
- byte[] tooLongPacket = PacketBuilder.CreateChat(Messages.RanchSavedTitleTooLongError, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(tooLongPacket);
- break;
- }
-
- object filterReason = Chat.FilterMessage(title);
- if (filterReason != null)
- {
- byte[] msg = PacketBuilder.CreateChat(Messages.RanchSavedTitleViolationsError, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(msg);
- return;
- }
-
- filterReason = Chat.FilterMessage(desc);
- if (filterReason != null)
- {
- Chat.Reason reason = (Chat.Reason)filterReason;
- byte[] msg = PacketBuilder.CreateChat(Messages.FormatRanchDesriptionBlocked(reason.Message), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(msg);
- return;
- }
-
-
- sender.LoggedinUser.OwnedRanch.Title = title;
- sender.LoggedinUser.OwnedRanch.Description = desc;
- }
- byte[] descriptionEditedMessage = PacketBuilder.CreateChat(Messages.RanchSavedRanchDescripton, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(descriptionEditedMessage);
-
- /*
- * Pinto bug: Saving ranch description will take you to the STATS menu
- * instead of just back to your ranch.
- */
-
- if (ConfigReader.FixOfficalBugs)
- UpdateArea(sender);
- else
- UpdateStats(sender);
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (ranch description, wrong size)");
- break;
- }
- break;
- case 12: // Abuse Report
- if (dynamicInput.Length >= 2)
- {
- string userName = dynamicInput[1];
- string reason = dynamicInput[2];
- if(Database.CheckUserExist(userName))
- {
- if(reason == "")
- {
- byte[] validReasonPlz = PacketBuilder.CreateChat(Messages.AbuseReportProvideValidReason, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(validReasonPlz);
- break;
- }
-
- Database.AddReport(sender.LoggedinUser.Username, userName, reason);
- byte[] chatPacket = PacketBuilder.CreateChat(Messages.AbuseReportFiled, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatPacket);
- UpdateArea(sender);
- break;
- }
- else
- {
- byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAbuseReportPlayerNotFound(userName), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatPacket);
- break;
- }
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (private notes, wrong size)");
- break;
- }
- case 13: // Libary Ranch Search
- if (dynamicInput.Length >= 2)
- {
- string searchQuery = dynamicInput[1];
- sender.LoggedinUser.MajorPriority = true;
- byte[] serachResponse = PacketBuilder.CreateMetaPacket(Meta.BuildRanchSearchResults(searchQuery));
- sender.SendPacket(serachResponse);
- break;
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (private notes, wrong size)");
- break;
- }
- case 14:
- if(dynamicInput.Length >= 1)
- {
- string password = dynamicInput[1];
- // Get current tile
- if(World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
- {
- World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
- if(tile.Code != null)
- {
- if (tile.Code.StartsWith("PASSWORD-"))
- {
- string[] args = tile.Code.Replace("!", "-").Split('-');
- if (args.Length >= 3)
- {
- string expectedPassword = args[1];
- int questId = int.Parse(args[2]);
- if (password.ToLower() == expectedPassword.ToLower())
- {
- Quest.CompleteQuest(sender.LoggedinUser, Quest.GetQuestById(questId), false);
- }
- else
- {
- Quest.QuestResult result = Quest.FailQuest(sender.LoggedinUser, Quest.GetQuestById(questId), true);
- if (result.NpcChat == null || result.NpcChat == "")
- result.NpcChat = Messages.IncorrectPasswordMessage;
- byte[] ChatPacket = PacketBuilder.CreateChat(result.NpcChat, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(ChatPacket);
- }
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Send invalid password input request. (Too few arguments!)");
- break;
- }
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Send password input request. (Not on password tile!)");
- break;
- }
- }
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Sent a password while not in a special tile.");
- break;
- }
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid password request, (wrong size)");
- break;
- }
-
- break;
- case 15: // Real Time Quiz
- if (dynamicInput.Length >= 2)
- {
- if(QuizEvent != null)
- {
- if (sender.LoggedinUser.InRealTimeQuiz)
- {
- RealTimeQuiz.Participent participent = QuizEvent.JoinEvent(sender.LoggedinUser);
- string answer = dynamicInput[1];
- participent.CheckAnswer(answer);
- }
- }
- break;
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (RealTimeQuiz, wrong size)");
- break;
- }
- default:
- Logger.ErrorPrint("Unknown dynamic input: " + inputId.ToString() + " packet dump: " + BitConverter.ToString(packet).Replace("-", " "));
- break;
- }
-
-
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (wrong size)");
- return;
- }
- }
-
-
- }
-
- public static void OnPlayerInfoPacket(GameClient sender, byte[] packet)
- {
- if (!sender.LoggedIn)
- {
- Logger.ErrorPrint(sender.RemoteIp + " Requests player info when not logged in.");
- return;
- }
- if(packet.Length < 3)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent playerinfo packet of wrong size");
- }
-
- byte method = packet[1];
- switch(method)
- {
- case PacketBuilder.PLAYERINFO_PLAYER_LIST:
- sender.LoggedinUser.MajorPriority = true;
- byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildPlayerListMenu(sender.LoggedinUser));
- sender.SendPacket(metaPacket);
- break;
- }
-
- }
- public static void OnDynamicButtonPressed(GameClient sender, byte[] packet)
- {
- if (!sender.LoggedIn)
- {
- Logger.ErrorPrint(sender.RemoteIp + " Clicked dyamic button when not logged in.");
- return;
- }
- string packetStr = Encoding.UTF8.GetString(packet);
- string buttonIdStr = packetStr.Substring(1, packetStr.Length - 3);
-
- switch(buttonIdStr)
- {
- case "2": // Compose Mail
- if(sender.LoggedinUser.Money <= 3)
- {
- byte[] cantAffordPostage = PacketBuilder.CreateChat(Messages.CityHallCantAffordPostageMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantAffordPostage);
- break;
- }
- sender.LoggedinUser.MajorPriority = true;
- byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildComposeMailMenu());
- sender.SendPacket(metaPacket);
- break;
- case "3": // Quest Log
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildQuestLog(sender.LoggedinUser));
- sender.SendPacket(metaPacket);
- break;
- case "4": // View Horse Breeds
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildHorseBreedListLibary());
- sender.SendPacket(metaPacket);
- break;
- case "5": // Back to horse
- if (sender.LoggedinUser.LastViewedHorse != null)
- UpdateHorseMenu(sender, sender.LoggedinUser.LastViewedHorse);
- break;
- case "6": // Equip companion
- if (sender.LoggedinUser.LastViewedHorse != null)
- {
- sender.LoggedinUser.MajorPriority = true;
- HorseInstance horseInstance = sender.LoggedinUser.LastViewedHorse;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildHorseCompanionEquipMenu(horseInstance,sender.LoggedinUser));
- sender.SendPacket(metaPacket);
- }
- break;
- case "7": // TP To nearest wagon (ranch)
- if(sender.LoggedinUser.OwnedRanch != null)
- {
- if(sender.LoggedinUser.OwnedRanch.GetBuildingCount(7) > 0) // Wagon
- {
- int ranchX = sender.LoggedinUser.OwnedRanch.X;
- int ranchY = sender.LoggedinUser.OwnedRanch.Y;
-
- double smallestDistance = Double.PositiveInfinity;
- int smalestTransportPointId = 0;
- for (int i = 0; i < Transport.TransportPoints.Count; i++)
- {
- Transport.TransportPoint tpPoint = Transport.TransportPoints[i];
-
- if(Transport.GetTransportLocation(tpPoint.Locations[0]).Type == "WAGON") // is wagon?
- {
- double distance = Util.PointsToDistance(ranchX, ranchY, tpPoint.X, tpPoint.Y);
- if(distance < smallestDistance)
- {
- smallestDistance = distance;
- smalestTransportPointId = i;
- }
- }
- }
- Transport.TransportPoint newPoint = Transport.TransportPoints[smalestTransportPointId];
-
- int newX = newPoint.X;
- int newY = newPoint.Y;
-
- if (World.InSpecialTile(newX, newY))
- {
- World.SpecialTile tile = World.GetSpecialTile(newX, newY);
- if (tile.ExitX != 0)
- newX = tile.ExitX;
- if (tile.ExitY != 0)
- newY = tile.ExitY;
- }
-
- byte[] transported = PacketBuilder.CreateChat(Messages.RanchWagonDroppedYouOff, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(transported);
- sender.LoggedinUser.Teleport(newX, newY);
- }
- }
- break;
- case "8":
- if(sender.LoggedinUser.LastViewedHorse != null)
- {
- sender.LoggedinUser.MajorPriority = true;
- HorseInstance horseInstance = sender.LoggedinUser.LastViewedHorse;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildHorseReleaseConfirmationMessage(horseInstance));
- sender.SendPacket(metaPacket);
- }
- break;
- case "9": // View Tack (Libary)
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildTackLibary());
- sender.SendPacket(metaPacket);
- break;
- case "10": // View Companions (Libary)
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildCompanionLibary());
- sender.SendPacket(metaPacket);
- break;
- case "11": // Randomize horse name
- if (sender.LoggedinUser.LastViewedHorse != null)
- {
- sender.LoggedinUser.MajorPriority = true;
- HorseInstance horseInstance = sender.LoggedinUser.LastViewedHorse;
- horseInstance.ChangeNameWithoutUpdatingDatabase(HorseInfo.GenerateHorseName());
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildHorseDescriptionEditMeta(horseInstance));
- sender.SendPacket(metaPacket);
- }
- break;
- case "12": // View Minigames (Libary)
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildMinigamesLibary());
- sender.SendPacket(metaPacket);
- break;
- case "13": // Train All (Ranch)
- if (sender.LoggedinUser.OwnedRanch != null)
- {
- if(sender.LoggedinUser.OwnedRanch.GetBuildingCount(6) > 0) // Training Pen
- {
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildRanchTraining(sender.LoggedinUser));
- sender.SendPacket(metaPacket);
- }
- }
- break;
- case "14": // Most Valued Ranches
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildMostValuedRanches());
- sender.SendPacket(metaPacket);
- break;
- case "15": // Most Richest Players
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildRichestPlayers());
- sender.SendPacket(metaPacket);
- break;
- case "16": // Most Adventurous Players
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildAdventurousPlayers());
- sender.SendPacket(metaPacket);
- break;
- case "17": // Most Experienced Players
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildExperiencedPlayers());
- sender.SendPacket(metaPacket);
- break;
- case "18": // Best Minigame Players
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildMinigamePlayers());
- sender.SendPacket(metaPacket);
- break;
- case "19": // Most Experienced Horses
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildMostExperienedHoses());
- sender.SendPacket(metaPacket);
- break;
- case "20": // Minigame Rankings
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildMinigameRankingsForUser(sender.LoggedinUser));
- sender.SendPacket(metaPacket);
- break;
- case "21": // Private Notes
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildPrivateNotes(sender.LoggedinUser));
- sender.SendPacket(metaPacket);
- break;
- case "22": // View Locations (Libary)
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildLocationsLibary());
- sender.SendPacket(metaPacket);
- break;
- case "23": // View Awards (Libary)
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildAwardsLibary());
- sender.SendPacket(metaPacket);
- break;
- case "26": // Buy Horse (Auto Sell)
- if(sender.LoggedinUser.LastViewedHorseOther != null)
- {
- bool isOnRanch = false;
- bool isOnPlayer = false;
- HorseInstance horseToSell = sender.LoggedinUser.LastViewedHorseOther;
- if (Ranch.IsRanchOwned(horseToSell.Owner))
- {
- Ranch ranch = Ranch.GetRanchOwnedBy(horseToSell.Owner);
- if(sender.LoggedinUser.X == ranch.X && sender.LoggedinUser.Y == ranch.Y)
- {
- isOnRanch = true;
- }
-
- }
- if(GameServer.IsUserOnline(horseToSell.Owner))
- {
- User user = GameServer.GetUserById(horseToSell.Owner);
- if (user.X == sender.LoggedinUser.X && user.Y == sender.LoggedinUser.Y)
- {
- isOnPlayer = true;
- }
- }
-
- if (isOnRanch || isOnPlayer)
- {
-
- if (horseToSell.AutoSell == 0)
- break;
- if(sender.LoggedinUser.Money >= horseToSell.AutoSell)
- {
- if (sender.LoggedinUser.HorseInventory.HorseList.Length + 1 > sender.LoggedinUser.MaxHorses)
- {
- byte[] tooManyHorses = PacketBuilder.CreateChat(Messages.AutoSellTooManyHorses, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(tooManyHorses);
- break;
- }
-
- sender.LoggedinUser.TakeMoney(horseToSell.AutoSell);
-
- if (IsUserOnline(horseToSell.Owner))
- {
- User seller = GetUserById(horseToSell.Owner);
- seller.HorseInventory.DeleteHorse(horseToSell, false);
- seller.AddMoney(horseToSell.AutoSell);
-
- byte[] horseBrought = PacketBuilder.CreateChat(Messages.FormatAutoSellSold(horseToSell.Name, horseToSell.AutoSell, sender.LoggedinUser.Username), PacketBuilder.CHAT_BOTTOM_RIGHT);
- seller.LoggedinClient.SendPacket(horseBrought);
- }
- else
- {
- Database.AddMessageToQueue(horseToSell.Owner, Messages.FormatAutoSellSoldOffline(horseToSell.Name, horseToSell.AutoSell, sender.LoggedinUser.Username));
- try
- {
- Database.SetPlayerMoney((Database.GetPlayerMoney(horseToSell.Owner) + horseToSell.AutoSell), horseToSell.Owner);
- }
- catch (OverflowException)
- {
- Database.SetPlayerMoney(2147483647, horseToSell.Owner);
- }
- }
-
- horseToSell.Owner = sender.LoggedinUser.Id;
- horseToSell.AutoSell = 0;
- sender.LoggedinUser.HorseInventory.AddHorse(horseToSell, false);
-
- byte[] success = PacketBuilder.CreateChat(Messages.FormatAutoSellSuccess(horseToSell.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(success);
-
- UpdateArea(sender);
- break;
- }
- else
- {
- byte[] noMoney = PacketBuilder.CreateChat(Messages.AutoSellInsufficentFunds, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(noMoney);
- break;
- }
-
- }
- else
- {
- byte[] notInRightPlace = PacketBuilder.CreateChat(Messages.AutoSellNotStandingInSamePlace, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(notInRightPlace);
- break;
- }
-
-
- }
- break;
- case "24": // Award List
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildAwardList(sender.LoggedinUser));
- sender.SendPacket(metaPacket);
- break;
- case "27": // Ranch Edit
- if(sender.LoggedinUser.OwnedRanch != null)
- {
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildRanchEdit(sender.LoggedinUser.OwnedRanch));
- sender.SendPacket(metaPacket);
- }
- break;
- case "29": // Auto Sell Horses
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildTopAutoSellHorses());
- sender.SendPacket(metaPacket);
- break;
- case "31":
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildRanchSearchLibary());
- sender.SendPacket(metaPacket);
- break;
- case "35": // Buddy List
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildBuddyList(sender.LoggedinUser));
- sender.SendPacket(metaPacket);
- break;
- case "36": // Nearby list
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildNearbyList(sender.LoggedinUser));
- sender.SendPacket(metaPacket);
- break;
- case "37": // All Players List
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildPlayerList(sender.LoggedinUser));
- sender.SendPacket(metaPacket);
- break;
- case "40": // All Players Alphabetical
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildPlayerListAlphabetical(sender.LoggedinUser));
- sender.SendPacket(metaPacket);
- break;
- case "30": // Find NPC
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildFindNpcMenu());
- sender.SendPacket(metaPacket);
- break;
- case "25": // Set auto sell price
- if (sender.LoggedinUser.LastViewedHorse != null)
- {
- sender.LoggedinUser.MajorPriority = true;
- HorseInstance horseInstance = sender.LoggedinUser.LastViewedHorse;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildAutoSellMenu(horseInstance));
- sender.SendPacket(metaPacket);
- }
- break;
- case "33": // View All stats (Horse)
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildAllBasicStats(sender.LoggedinUser));
- sender.SendPacket(metaPacket);
- break;
- case "34": // View Basic stats (Horse)
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildAllStats(sender.LoggedinUser));
- sender.SendPacket(metaPacket);
- break;
- case "38": // Read Books
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildBooksLibary());
- sender.SendPacket(metaPacket);
- break;
- case "41": // Put horse into auction
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildAuctionHorseList(sender.LoggedinUser));
- sender.SendPacket(metaPacket);
- break;
- case "47":
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildPawneerOrderBreedList());
- sender.SendPacket(metaPacket);
- break;
- case "53": // Misc Stats / Tracked Items
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildMiscStats(sender.LoggedinUser));
- sender.SendPacket(metaPacket);
- break;
- case "58": // Add new item to trade
- if(sender.LoggedinUser.TradingWith != null)
- {
- sender.LoggedinUser.TradeMenuPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildTradeAdd(sender.LoggedinUser.TradingWith));
- sender.SendPacket(metaPacket);
- }
- break;
- case "59": // Done
- if (sender.LoggedinUser.TradingWith != null)
- {
- sender.LoggedinUser.TradingWith.Stage = "DONE";
-
- if (sender.LoggedinUser.TradingWith != null)
- if (sender.LoggedinUser.TradingWith.OtherTrade.Trader.TradeMenuPriority == false)
- UpdateArea(sender.LoggedinUser.TradingWith.OtherTrade.Trader.LoggedinClient);
- UpdateArea(sender);
-
- }
- break;
- case "60": // Ranch Sell
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildRanchSellConfirmation());
- sender.SendPacket(metaPacket);
- break;
- case "61": // Most Spoiled Horse
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildMostSpoiledHorses());
- sender.SendPacket(metaPacket);
- break;
- case "28c1": // Abuse Report
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildAbuseReportPage());
- sender.SendPacket(metaPacket);
- break;
- case "52c1": // Horse set to KEEPER
- string category = "KEEPER";
- goto setCategory;
- case "52c2": // Horse set to TRAINING
- category = "TRAINING";
- goto setCategory;
- case "52c3": // Horse set to TRADING
- category = "TRADING";
- goto setCategory;
- case "52c4": // Horse set to RETIRED
- category = "RETIRED";
- goto setCategory;
- setCategory:;
- if (sender.LoggedinUser.LastViewedHorse != null)
- {
- sender.LoggedinUser.LastViewedHorse.Category = category;
- byte[] categoryChangedPacket = PacketBuilder.CreateChat(Messages.FormatHorseSetToNewCategory(category), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(categoryChangedPacket);
-
- sender.LoggedinUser.MajorPriority = true;
- UpdateHorseMenu(sender, sender.LoggedinUser.LastViewedHorse);
- }
- break;
-
- default:
- if(buttonIdStr.StartsWith("39c")) // Book Read
- {
- string idStr = buttonIdStr.Substring(3);
- int bookId = -1;
- try
- {
- bookId = int.Parse(idStr);
- }
- catch (FormatException)
- {
- Logger.DebugPrint(sender.LoggedinUser.Username + " Tried to read a book of id NaN");
- break;
- };
-
- if(Book.BookExists(bookId))
- {
- Book book = Book.GetBookById(bookId);
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildBookReadLibary(book));
- sender.SendPacket(metaPacket);
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + "Tried to read a book that doesnt exist.");
- }
- break;
- }
- if (buttonIdStr.StartsWith("32c")) // Horse Whisperer
- {
- string idStr = buttonIdStr.Substring(3);
- int breedId = -1;
- try
- {
- breedId = int.Parse(idStr);
- }
- catch (FormatException)
- {
- Logger.DebugPrint(sender.LoggedinUser.Username + " Tried to whisper a horse with BreedId NaN.");
- break;
- };
-
- if (sender.LoggedinUser.Money < 50000)
- {
- byte[] cannotAffordMessage = PacketBuilder.CreateChat(Messages.WhispererServiceCannotAfford, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cannotAffordMessage);
- break;
- }
-
- List horsesFound = new List();
- foreach (WildHorse horse in WildHorse.WildHorses)
- {
- if (horse.Instance.Breed.Id == breedId)
- {
- horsesFound.Add(horse);
- }
- }
- int cost = 0;
- if (horsesFound.Count >= 1)
- {
- cost = 50000;
- }
- else
- {
- cost = 10000;
- }
- sender.LoggedinUser.MajorPriority = true;
-
- byte[] pricingMessage = PacketBuilder.CreateChat(Messages.FormatWhispererPrice(cost), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(pricingMessage);
-
- byte[] serachResultMeta = PacketBuilder.CreateMetaPacket(Meta.BuildWhisperSearchResults(horsesFound.ToArray()));
- sender.SendPacket(serachResultMeta);
-
- sender.LoggedinUser.TakeMoney(cost);
- break;
- }
- else if (buttonIdStr.StartsWith("4c")) // Libary Breed Search
- {
- string idStr = buttonIdStr.Substring(2);
- int breedId = -1;
- HorseInfo.Breed horseBreed;
- try
- {
- breedId = int.Parse(idStr);
- horseBreed = HorseInfo.GetBreedById(breedId);
- }
- catch (Exception)
- {
- Logger.DebugPrint(sender.LoggedinUser.Username + " Sent invalid libary breed viewer request.");
- break;
- };
- sender.LoggedinUser.MajorPriority = true;
- string metaTag = Meta.BuildBreedViewerLibary(horseBreed);
- metaPacket = PacketBuilder.CreateMetaPacket(metaTag);
- sender.SendPacket(metaPacket);
-
- string swf = "breedviewer.swf?terrain=book&breed=" + horseBreed.Swf + "&j=";
- byte[] loadSwf = PacketBuilder.CreateSwfModulePacket(swf, PacketBuilder.PACKET_SWF_MODULE_FORCE);
- sender.SendPacket(loadSwf);
-
- break;
-
- }
- else if (buttonIdStr.StartsWith("50c"))
- {
- string gender = buttonIdStr.Substring(3);
- if (sender.LoggedinUser.PawneerOrderBreed != null)
- {
- if (sender.LoggedinUser.PawneerOrderBreed.GenderTypes().Contains(gender))
- {
- if (sender.LoggedinUser.Inventory.HasItemId(Item.PawneerOrder))
- {
- sender.LoggedinUser.PawneerOrderGender = gender;
-
- HorseInstance horseInstance = new HorseInstance(sender.LoggedinUser.PawneerOrderBreed);
- horseInstance.Color = sender.LoggedinUser.PawneerOrderColor;
- horseInstance.Gender = sender.LoggedinUser.PawneerOrderGender;
- horseInstance.Name = "Pawneer Order";
-
- sender.LoggedinUser.Inventory.Remove(sender.LoggedinUser.Inventory.GetItemByItemId(Item.PawneerOrder).ItemInstances[0]);
- sender.LoggedinUser.HorseInventory.AddHorse(horseInstance, true, true);
-
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildPawneerOrderFound(horseInstance));
- sender.SendPacket(metaPacket);
- break;
- }
- }
- }
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Error occured when doing a Pawneer Order.");
- break;
- }
- else if (buttonIdStr.StartsWith("49c"))
- {
- string color = buttonIdStr.Substring(3);
- if (sender.LoggedinUser.PawneerOrderBreed != null)
- {
- if (sender.LoggedinUser.PawneerOrderBreed.Colors.Contains(color))
- {
- sender.LoggedinUser.PawneerOrderColor = color;
-
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildPawneerOrderGenderList(sender.LoggedinUser.PawneerOrderBreed, color));
- sender.SendPacket(metaPacket);
- break;
- }
- }
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Asked for a horse of an unknown color " + color);
- break;
- }
- else if (buttonIdStr.StartsWith("48c")) // Pawneer Order Breed Select
- {
- string idStr = buttonIdStr.Substring(3);
- int breedId = -1;
- HorseInfo.Breed breed;
- try
- {
- breedId = int.Parse(idStr);
- breed = HorseInfo.GetBreedById(breedId);
- }
- catch (Exception)
- {
- Logger.DebugPrint(sender.LoggedinUser.Username + " Tried to pawner order a horse with id NaN.");
- break;
- }
- sender.LoggedinUser.PawneerOrderBreed = breed;
-
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildPawneerOrderColorList(breed));
- sender.SendPacket(metaPacket);
- break;
- }
- else if (buttonIdStr.StartsWith("43c")) // Pawn Horse Confirm
- {
- string idStr = buttonIdStr.Substring(3);
- int horseId = -1;
- try
- {
- horseId = int.Parse(idStr);
- }
- catch (FormatException)
- {
- Logger.DebugPrint(sender.LoggedinUser.Username + " Tried to pawn a horse with id NaN.");
- break;
- }
-
- if (sender.LoggedinUser.HorseInventory.HorseIdExist(horseId))
- {
- HorseInstance inst = sender.LoggedinUser.HorseInventory.GetHorseById(horseId);
- int price = Pawneer.CalculateTotalPrice(inst);
- string name = inst.Name;
-
- sender.LoggedinUser.HorseInventory.DeleteHorse(inst); // 1000% a "distant land.."
- sender.LoggedinUser.LastViewedHorse = null;
-
- sender.LoggedinUser.AddMoney(price);
- byte[] soldHorseMessage = PacketBuilder.CreateChat(Messages.FormatPawneerSold(name, price), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(soldHorseMessage);
-
- sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.HorsePawn).Count++;
- if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.HorsePawn).Count >= 100)
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(44)); // Vendor
- if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.HorsePawn).Count >= 1000)
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(45)); // Pro Vendor
- if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.HorsePawn).Count >= 10000)
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(52)); // Top Vendor
-
- UpdateArea(sender);
-
- break;
- }
- else
- {
- byte[] cantFindHorse = PacketBuilder.CreateChat(Messages.PawneerHorseNotFound, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantFindHorse);
- }
- break;
- }
- else if (buttonIdStr.StartsWith("51c")) // Pawn Horse
- {
- string idStr = buttonIdStr.Substring(3);
- int horseId = -1;
- try
- {
- horseId = int.Parse(idStr);
- }
- catch (FormatException)
- {
- Logger.DebugPrint(sender.LoggedinUser.Username + " Tried to pawn a horse with id NaN.");
- break;
- }
-
- if (sender.LoggedinUser.HorseInventory.HorseIdExist(horseId))
- {
- HorseInstance inst = sender.LoggedinUser.HorseInventory.GetHorseById(horseId);
-
- sender.LoggedinUser.MajorPriority = true;
- byte[] confirmScreen = PacketBuilder.CreateMetaPacket(Meta.BuildPawneerConfimation(inst));
- sender.SendPacket(confirmScreen);
- break;
- }
- else
- {
- byte[] cantFindHorse = PacketBuilder.CreateChat(Messages.PawneerHorseNotFound, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantFindHorse);
- }
- break;
- }
- else if (buttonIdStr.StartsWith("42c"))
- {
- string idStr = buttonIdStr.Substring(3);
- int horseId = -1;
- try
- {
- horseId = int.Parse(idStr);
- }
- catch (FormatException)
- {
- Logger.DebugPrint(sender.LoggedinUser.Username + " Tried to auction a horse with id NaN.");
- break;
- }
- if (sender.LoggedinUser.HorseInventory.HorseIdExist(horseId))
- {
- HorseInstance inst = sender.LoggedinUser.HorseInventory.GetHorseById(horseId);
-
- if(World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
- {
- World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
- if(tile.Code == null || !tile.Code.StartsWith("AUCTION-"))
- {
- Logger.ErrorPrint("Cant find auction room that " + sender.LoggedinUser.Username + " Is trying to place a horse in.");
- return;
- }
- Auction auctionRoom = Auction.GetAuctionRoomById(int.Parse(tile.Code.Split('-')[1]));
- if(auctionRoom.HasUserPlacedAuctionAllready(sender.LoggedinUser))
- {
- byte[] cantPlaceAuction = PacketBuilder.CreateChat(Messages.AuctionOneHorsePerPlayer, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantPlaceAuction);
- break;
- }
- if (sender.LoggedinUser.Money >= 1000)
- {
- sender.LoggedinUser.TakeMoney(1000);
- Auction.AuctionEntry entry = new Auction.AuctionEntry(8, 0, sender.LoggedinUser.Id);
- entry.Horse = inst;
- entry.OwnerId = sender.LoggedinUser.Id;
- entry.Completed = false;
- inst.Hidden = true;
- auctionRoom.AddEntry(entry);
- UpdateArea(sender);
- UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y, true);
- break;
- }
- else
- {
- byte[] cantAffordAuctionMsg = PacketBuilder.CreateChat(Messages.AuctionCantAffordAuctionFee, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantAffordAuctionMsg);
- }
- }
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to auction a horse they did not have.");
- break;
- }
- }
- if (Leaser.LeaserButtonIdExists(buttonIdStr))
- {
- Leaser horseLeaser = Leaser.GetLeaserByButtonId(buttonIdStr);
-
- if(sender.LoggedinUser.Money >= horseLeaser.Price)
- {
- if(sender.LoggedinUser.HorseInventory.HorseList.Length + 1 > sender.LoggedinUser.MaxHorses)
- {
- byte[] cantManageHorses = PacketBuilder.CreateChat(Messages.HorseLeaserHorsesFull, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantManageHorses);
- break;
- }
- else
- {
- sender.LoggedinUser.MajorPriority = true;
- sender.LoggedinUser.TakeMoney(horseLeaser.Price);
-
- HorseInstance leaseHorse = horseLeaser.GenerateLeaseHorse();
-
- if(leaseHorse.Breed.Id == 170) // UniPeg
- {
- sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.UnipegTeamup).Count++;
- if(sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.UnipegTeamup).Count >= 5)
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(55)); // UniPeg Friend
- }
- else if(leaseHorse.Breed.Type == "unicorn")
- {
- sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.UnicornTeamup).Count++;
- if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.UnicornTeamup).Count >= 5)
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(42)); // Unicorn Friend
- }
- else if(leaseHorse.Breed.Type == "pegasus")
- {
- sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.PegasusTeamup).Count++;
- if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.PegasusTeamup).Count >= 5)
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(43)); // Pegasus Friend
- }
-
- sender.LoggedinUser.HorseInventory.AddHorse(leaseHorse);
-
- byte[] addedHorseMeta = PacketBuilder.CreateMetaPacket(Meta.BuildLeaserOnLeaseInfo(horseLeaser));
- sender.SendPacket(addedHorseMeta);
-
- byte[] addedNewTempHorseMessage = PacketBuilder.CreateChat(Messages.HorseLeaserTemporaryHorseAdded, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(addedNewTempHorseMessage);
- break;
-
- }
- }
- else
- {
- byte[] cantAffordLease = PacketBuilder.CreateChat(Messages.HorseLeaserCantAffordMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantAffordLease);
- break;
- }
-
- }
- if(AbuseReport.DoesReasonExist(buttonIdStr))
- {
- sender.LoggedinUser.MajorPriority = true;
- metaPacket = PacketBuilder.CreateMetaPacket(AbuseReport.GetReasonById(buttonIdStr).Meta);
- sender.SendPacket(metaPacket);
- break;
- }
-
- Logger.ErrorPrint("Dynamic button #" + buttonIdStr + " unknown... Packet Dump: "+BitConverter.ToString(packet).Replace("-", " "));
- break;
- }
- }
- public static void OnArenaScored(GameClient sender, byte[] packet)
- {
- if (!sender.LoggedIn)
- {
- Logger.ErrorPrint(sender.RemoteIp + " Requested user information when not logged in.");
- return;
- }
- if(packet.Length <= 3)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + "Sent invalid Arena Scored Packet.");
- return;
- }
- string packetStr = Encoding.UTF8.GetString(packet);
- string scoreStr = packetStr.Substring(1, packet.Length - 3);
- int score = -1;
- try
- {
- score = int.Parse(scoreStr);
- }
- catch(FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Scored NAN in an arena.");
- return;
- }
-
- if(Arena.UserHasEnteredHorseInAnyArena(sender.LoggedinUser))
- {
- byte[] waitingOnResults = PacketBuilder.CreateChat(Messages.FormatArenaYourScore(score), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(waitingOnResults);
-
- Arena enteredArena = Arena.GetArenaUserEnteredIn(sender.LoggedinUser);
- enteredArena.SubmitScore(sender.LoggedinUser, score);
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Scored in an arena while not in one");
- }
- return;
-
- }
- public static void OnUserInfoRequest(GameClient sender, byte[] packet)
- {
- if (!sender.LoggedIn)
- {
- Logger.ErrorPrint(sender.RemoteIp + " Requested user information when not logged in.");
- return;
- }
-
- // Prevent duplicate requests.
- if (sender.LoggedinUser.UserInfoSend)
- return;
-
- sender.LoggedinUser.UserInfoSend = true;
-
- // This allows the website to view that the player is online.
- Database.AddOnlineUser(sender.LoggedinUser.Id, sender.LoggedinUser.Administrator, sender.LoggedinUser.Moderator, sender.LoggedinUser.Subscribed, sender.LoggedinUser.NewPlayer);
-
- Logger.DebugPrint(sender.LoggedinUser.Username + " Requested user information.");
- User user = sender.LoggedinUser;
-
- // Send player current location & map data
- byte[] MovementPacket = PacketBuilder.CreateMovementPacket(user.X, user.Y, user.CharacterId, user.Facing, PacketBuilder.DIRECTION_TELEPORT, true);
- sender.SendPacket(MovementPacket);
-
- // Send "Welcome to the Secret Land of Horses" message.
- byte[] WelcomeMessage = PacketBuilder.CreateWelcomeMessage(user.Username);
- sender.SendPacket(WelcomeMessage);
-
- // Send weather effects, and current server time.
- byte[] WorldData = PacketBuilder.CreateWorldData(World.ServerTime.Minutes, World.ServerTime.Days, World.ServerTime.Years, sender.LoggedinUser.GetWeatherSeen());
- sender.SendPacket(WorldData);
-
- // if the player is logging in for the first time, send Welcome newest rider of Horse Isle message.
- if (sender.LoggedinUser.NewPlayer)
- {
- byte[] NewUserMessage = PacketBuilder.CreateChat(Messages.NewUserMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(NewUserMessage);
- }
-
- // Send Security Codes, used (badly) to verify Minigame Rewards
- byte[] SecCodePacket = PacketBuilder.CreateSecCode(user.SecCodeSeeds, user.SecCodeInc, user.Administrator, user.Moderator);
- sender.SendPacket(SecCodePacket);
-
- // Send player money count, total players and total unread mail.
- byte[] BaseStatsPacketData = PacketBuilder.CreatePlayerData(user.Money, GameServer.GetNumberOfPlayers(), user.MailBox.UnreadMailCount);
- sender.SendPacket(BaseStatsPacketData);
-
- // Sends Meta Window information (Nearby, current tile, etc)
- UpdateArea(sender);
-
- /*
- * Send all nearby players locations to the client
- * if there not nearby, say there at 1000,1000.
- */
- foreach (GameClient client in GameClient.ConnectedClients)
- {
- if (client.LoggedIn)
- {
- if (client.LoggedinUser.Id != user.Id)
- {
- if(IsOnScreen(client.LoggedinUser.X, client.LoggedinUser.Y, sender.LoggedinUser.X, sender.LoggedinUser.Y))
- {
- byte[] PlayerInfo = PacketBuilder.CreatePlayerInfoUpdateOrCreate(client.LoggedinUser.X, client.LoggedinUser.Y, client.LoggedinUser.Facing, client.LoggedinUser.CharacterId, client.LoggedinUser.Username);
- sender.SendPacket(PlayerInfo);
- }
- else
- {
- byte[] PlayerInfo = PacketBuilder.CreatePlayerInfoUpdateOrCreate(1000+4, 1000+1, client.LoggedinUser.Facing, client.LoggedinUser.CharacterId, client.LoggedinUser.Username);
- sender.SendPacket(PlayerInfo);
- }
- }
- }
- }
-
- /*
- * Update all nearby users
- * that the new player logged in.
- */
- foreach (User nearbyUser in GameServer.GetNearbyUsers(sender.LoggedinUser.X, sender.LoggedinUser.Y, false, false))
- if (nearbyUser.Id != sender.LoggedinUser.Id)
- if(!nearbyUser.MajorPriority)
- if(!nearbyUser.MinorPriority)
- UpdateArea(nearbyUser.LoggedinClient);
-
- /*
- * Send a list of isles, towns and areas to the player
- * This is used for the world map.
- */
-
- byte[] IsleData = PacketBuilder.CreatePlaceData(World.Isles.ToArray(), World.Towns.ToArray(), World.Areas.ToArray());
- sender.SendPacket(IsleData);
-
- // Tells the client which tiles are passable, which the player should appear ontop of and which it should be below.
- byte[] TileFlags = PacketBuilder.CreateTileOverlayFlags(Map.OverlayTileDepth);
- sender.SendPacket(TileFlags);
-
- // Send Todays Note:
- byte[] MotdData = PacketBuilder.CreateMotd();
- sender.SendPacket(MotdData);
-
- // Send riddle annoucement
- if (RiddleEvent != null)
- if (RiddleEvent.Active)
- RiddleEvent.ShowStartMessage(sender);
-
- /*
- * Gives Queued Items
- * When you buy a PO from the store on the website
- * its added to this queued items list.
- */
- DoItemPurchases(sender);
-
- // Send Queued Messages
- string[] queuedMessages = Database.GetMessageQueue(sender.LoggedinUser.Id);
- foreach(string queuedMessage in queuedMessages)
- {
- byte[] msg = PacketBuilder.CreateChat(Messages.MessageQueueHeader+queuedMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(msg);
- }
- Database.ClearMessageQueue(sender.LoggedinUser.Id);
-
- // Send "Playername Logged in" message
- byte[] loginMessageBytes = PacketBuilder.CreateChat(Messages.FormatLoginMessage(sender.LoggedinUser.Username), PacketBuilder.CHAT_BOTTOM_LEFT);
- foreach (GameClient client in GameClient.ConnectedClients)
- if (client.LoggedIn)
- if (!client.LoggedinUser.MuteLogins && !client.LoggedinUser.MuteAll)
- if (client.LoggedinUser.Id != sender.LoggedinUser.Id)
- client.SendPacket(loginMessageBytes);
-
-
- /*
- * Send players nearby to you
- * your position, otherwise just send 1000,1000
- */
- byte[] yourPlayerInfo = PacketBuilder.CreatePlayerInfoUpdateOrCreate(sender.LoggedinUser.X, sender.LoggedinUser.Y, sender.LoggedinUser.Facing, sender.LoggedinUser.CharacterId, sender.LoggedinUser.Username);
- byte[] yourPlayerInfoOffscreen = PacketBuilder.CreatePlayerInfoUpdateOrCreate(1000 + 4, 1000 + 1, sender.LoggedinUser.Facing, sender.LoggedinUser.CharacterId, sender.LoggedinUser.Username);
-
- foreach (GameClient client in GameClient.ConnectedClients)
- {
- if (client.LoggedIn)
- {
- if (client.LoggedinUser.Id != sender.LoggedinUser.Id)
- {
- if (IsOnScreen(client.LoggedinUser.X, client.LoggedinUser.Y, sender.LoggedinUser.X, sender.LoggedinUser.Y))
- client.SendPacket(yourPlayerInfo);
- else
- client.SendPacket(yourPlayerInfoOffscreen);
- }
- }
- }
-
-
-
- }
-
- public static void OnSwfModuleCommunication(GameClient sender, byte[] packet)
- {
- if (!sender.LoggedIn)
- {
- Logger.ErrorPrint(sender.RemoteIp + " tried to send swf communication when not logged in.");
- return;
- }
- if (packet.Length < 4)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid swf commmunication Packet");
- return;
- }
-
-
- byte module = packet[1];
- switch(module)
- {
- case PacketBuilder.SWFMODULE_INVITE:
- if(packet.Length < 4)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid 2PLAYER INVITE Packet (WRONG SIZE)");
- break;
- }
- string packetStr = Encoding.UTF8.GetString(packet);
- string playerIdStr = packetStr.Substring(2, packetStr.Length - 4);
- int playerId = -1;
- try
- {
- playerId = int.Parse(playerIdStr);
- }
- catch (Exception) { };
-
- if(IsUserOnline(playerId))
- {
- User toInvite = GetUserById(playerId);
- TwoPlayer twoPlayerGame = new TwoPlayer(toInvite, sender.LoggedinUser, false);
- }
- break;
- case PacketBuilder.SWFMODULE_ACCEPT:
- if (packet.Length < 4)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid 2PLAYER ACCEPT Packet (WRONG SIZE)");
- break;
- }
- packetStr = Encoding.UTF8.GetString(packet);
- playerIdStr = packetStr.Substring(2, packetStr.Length - 4);
- playerId = -1;
- try
- {
- playerId = int.Parse(playerIdStr);
- }
- catch (Exception) { };
-
- if (IsUserOnline(playerId))
- {
- User toAccept = GetUserById(playerId);
- if(TwoPlayer.IsPlayerInvitingPlayer(toAccept, sender.LoggedinUser))
- {
- TwoPlayer twoPlayerGame = TwoPlayer.GetGameInvitingPlayer(toAccept, sender.LoggedinUser);
- twoPlayerGame.Accept(sender.LoggedinUser);
- }
- }
- break;
- case PacketBuilder.SWFMODULE_DRAWINGROOM:
- if(packet.Length < 3)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid DRAWINGROOM packet (swf communication, WRONG SIZE)");
- break;
- }
- if(packet[2] == PacketBuilder.DRAWINGROOM_GET_DRAWING)
- {
- if (packet.Length < 6)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid DRAWINGROOM GET DRAWING packet (swf communication, WRONG SIZE)");
- break;
- }
- int roomId = packet[3] - 40;
- Drawingroom room;
- try
- {
- room = Drawingroom.GetDrawingRoomById(roomId);
- }
- catch(KeyNotFoundException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to load an invalid drawing room: " + roomId);
- break;
- }
-
- if(room.Drawing != "")
- {
- byte[] drawingPacket = PacketBuilder.CreateDrawingUpdatePacket(room.Drawing);
- sender.SendPacket(drawingPacket);
- }
-
- }
- else if(packet[2] == PacketBuilder.DRAWINGROOM_SAVE)
- {
- if (packet.Length < 5)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid DRAWINGROOM GET DRAWING packet (swf communication, WRONG SIZE)");
- break;
- }
-
- /*
- * The lack of an if case for if the user isnt subscribed
- * is NOT a bug thats just how pinto does it.
- * you can save but not load if your subscribed. weird huh?
- */
-
- int roomId = packet[3] - 40;
- Drawingroom room;
- try
- {
- room = Drawingroom.GetDrawingRoomById(roomId);
- }
- catch (KeyNotFoundException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to load an invalid drawing room: " + roomId);
- break;
- }
-
- if (!Database.SavedDrawingsExist(sender.LoggedinUser.Id))
- Database.CreateSavedDrawings(sender.LoggedinUser.Id);
-
- int slotNo = 0;
- byte slot = packet[4];
- switch (slot)
- {
- case 0x29: // Slot 1
- Database.SaveDrawingSlot1(sender.LoggedinUser.Id, room.Drawing);
- slotNo = 1;
- break;
- case 0x2A: // Slot 2
- Database.SaveDrawingSlot2(sender.LoggedinUser.Id, room.Drawing);
- slotNo = 2;
- break;
- case 0x2B: // Slot 3
- Database.SaveDrawingSlot3(sender.LoggedinUser.Id, room.Drawing);
- slotNo = 3;
- break;
- }
-
- byte[] savedDrawingMessage = PacketBuilder.CreateChat(Messages.FormatDrawingRoomSaved(slotNo), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(savedDrawingMessage);
-
- break;
- }
- else if (packet[2] == PacketBuilder.DRAWINGROOM_LOAD)
- {
- if (packet.Length < 5)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid DRAWINGROOM GET DRAWING packet (swf communication, WRONG SIZE)");
- break;
- }
-
- if(!sender.LoggedinUser.Subscribed)
- {
- byte[] notSubscribedCantLoad = PacketBuilder.CreateChat(Messages.DrawingCannotLoadNotSubscribed, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(notSubscribedCantLoad);
- break;
- }
-
- int roomId = packet[3] - 40;
- Drawingroom room;
- try{
- room = Drawingroom.GetDrawingRoomById(roomId);
- }
- catch (KeyNotFoundException){
- Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to load an invalid drawing room: " + roomId);
- break;
- }
-
- if (!Database.SavedDrawingsExist(sender.LoggedinUser.Id))
- Database.CreateSavedDrawings(sender.LoggedinUser.Id);
-
- int slotNo = 0;
- byte slot = packet[4];
- string drawingToAdd = "";
- switch (slot)
- {
- case 0x29: // Slot 1
- drawingToAdd = Database.LoadDrawingSlot1(sender.LoggedinUser.Id);
- slotNo = 1;
- break;
- case 0x2A: // Slot 2
- drawingToAdd = Database.LoadDrawingSlot2(sender.LoggedinUser.Id);
- slotNo = 2;
- break;
- case 0x2B: // Slot 3
- drawingToAdd = Database.LoadDrawingSlot3(sender.LoggedinUser.Id);
- slotNo = 3;
- break;
- }
-
- try {
- room.Drawing += drawingToAdd;
- }
- catch(DrawingroomFullException){
- byte[] roomFullMessage = PacketBuilder.CreateChat(Messages.DrawingPlzClearLoad, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(roomFullMessage);
- break;
- }
-
- Database.SetLastPlayer("D" + room.Id.ToString(), sender.LoggedinUser.Id);
- UpdateDrawingForAll("D" + room.Id, sender, drawingToAdd, true);
-
- byte[] loadedDrawingMessage = PacketBuilder.CreateChat(Messages.FormatDrawingRoomLoaded(slotNo), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(loadedDrawingMessage);
-
- break;
- }
- else // Default action- draw line
- {
- if (packet.Length < 5)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid DRAWINGROOM GET DRAWING packet (swf communication, WRONG SIZE)");
- break;
- }
-
- if(!sender.LoggedinUser.Subscribed)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to draw while not subscribed.");
- byte[] notSubscribedMessage = PacketBuilder.CreateChat(Messages.DrawingNotSentNotSubscribed, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(notSubscribedMessage);
- break;
- }
-
- int roomId = packet[2] - 40;
- Drawingroom room;
- try
- {
- room = Drawingroom.GetDrawingRoomById(roomId);
- }
- catch (KeyNotFoundException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to load an invalid drawing room: " + roomId);
- break;
- }
-
- packetStr = Encoding.UTF8.GetString(packet);
-
- string drawing = packetStr.Substring(3, packetStr.Length - 5);
- if (drawing.Contains("X!")) // Clear byte
- {
- room.Drawing = "";
- goto update;
- }
-
- try {
- room.Drawing += drawing;
- }
- catch (DrawingroomFullException)
- {
- byte[] roomFullMessage = PacketBuilder.CreateChat(Messages.DrawingPlzClearDraw, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(roomFullMessage);
- break;
- }
- update:;
- Database.SetLastPlayer("D" + room.Id.ToString(), sender.LoggedinUser.Id);
- UpdateDrawingForAll("D" + room.Id, sender, drawing, false);
- }
-
- break;
- case PacketBuilder.SWFMODULE_BRICKPOET:
- if(packet.Length < 5)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid BRICKPOET packet (swf communication, WRONG SIZE)");
- break;
- }
- if(packet[2] == PacketBuilder.BRICKPOET_LIST_ALL)
- {
- if (packet.Length < 6)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid BRICKPOET LIST ALL packet (swf communication, WRONG SIZE)");
- break;
- }
-
- int roomId = packet[3] - 40;
- Brickpoet.PoetryPeice[] room;
- try // Make sure the room exists-
- {
- room = Brickpoet.GetPoetryRoom(roomId);
- }
- catch(KeyNotFoundException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to load an invalid brickpoet room: " + roomId);
- break;
- }
- // Send list of peices
- byte[] poetPacket = PacketBuilder.CreateBrickPoetListPacket(room);
- sender.SendPacket(poetPacket);
-
- }
- else if(packet[3] == PacketBuilder.BRICKPOET_MOVE)
- {
- if (packet.Length < 0xB)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid BRICKPOET MOVE packet (swf communication, WRONG SIZE)");
- break;
- }
- packetStr = Encoding.UTF8.GetString(packet);
- if(!packetStr.Contains('|'))
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid BRICKPOET MOVE packet (swf communication, NO | SEPERATOR)");
- break;
- }
- string[] args = packetStr.Split('|');
- if(args.Length < 5)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid BRICKPOET MOVE Packet (swf communication, NOT ENOUGH | SEPERATORS.");
- break;
- }
-
- int roomId = packet[2] - 40;
- int peiceId;
- int x;
- int y;
- Brickpoet.PoetryPeice[] room;
- Brickpoet.PoetryPeice peice;
-
- try // Make sure these are acturally numbers!
- {
- peiceId = int.Parse(args[1]);
- x = int.Parse(args[2]);
- y = int.Parse(args[3]);
-
-
- room = Brickpoet.GetPoetryRoom(roomId);
- peice = Brickpoet.GetPoetryPeice(room, peiceId);
-
- }
- catch (Exception e)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " brickpoet - "+e.ToString());
- break;
- }
- // Change location in Database
- peice.X = x;
- peice.Y = y;
-
- foreach(User user in GetUsersOnSpecialTileCode("MULTIROOM-" + "P" + roomId.ToString())) // Send to each user!
- {
- if (user.Id == sender.LoggedinUser.Id)
- continue;
-
- byte[] updatePoetRoomPacket = PacketBuilder.CreateBrickPoetMovePacket(peice);
- user.LoggedinClient.SendPacket(updatePoetRoomPacket);
-
- }
-
- if (Database.GetLastPlayer("P" + roomId) != sender.LoggedinUser.Id)
- {
- Database.SetLastPlayer("P" + roomId, sender.LoggedinUser.Id);
- UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y, true);
- }
-
- break;
- }
- else
- {
- Logger.DebugPrint(" packet dump: " + BitConverter.ToString(packet).Replace("-", " "));
- break;
- }
-
- break;
- case PacketBuilder.SWFMODULE_DRESSUPROOM:
- if (packet.Length < 6)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid DRESSUPROOM packet (swf communication, WRONG SIZE)");
- break;
- }
- if (packet[2] == PacketBuilder.DRESSUPROOM_LIST_ALL)
- {
- int roomId = packet[3] - 40;
- Dressup.DressupRoom room = Dressup.GetDressupRoom(roomId);
-
- if (room.DressupPeices.Length > 0)
- {
- byte[] allDressupsResponse = PacketBuilder.CreateDressupRoomPeiceResponse(room.DressupPeices.ToArray());
- sender.SendPacket(allDressupsResponse);
- }
-
- }
- else // Move
- {
- if (packet.Length < 9)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid DRESSUPROOM MOVE packet (swf communication, WRONG SIZE)");
- break;
- }
-
- int roomId = packet[2] - 40;
- if (roomId <= 0)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid DRESSUPROOM MOVE packet (swf communication, INVALID ROOM)");
- break;
- }
- Dressup.DressupRoom room = Dressup.GetDressupRoom(roomId);
-
- packetStr = Encoding.UTF8.GetString(packet);
- string moveStr = packetStr.Substring(3, packetStr.Length - 5);
-
- string[] moves = moveStr.Split('|');
-
- if(moves.Length < 3)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid DRESSUPROOM MOVE packet (swf communication, MOVES WRONG SIZE)");
- break;
- }
-
- int peiceId;
- double moveToX;
- double moveToY;
- bool active = true;
- try // Make sure these are acturally numbers!
- {
- peiceId = int.Parse(moves[0]);
- if (moves[1] == "D" || moves[2] == "D")
- {
- active = false;
- moveToX = 0;
- moveToY = 0;
- }
- else
- {
- moveToX = double.Parse(moves[1]);
- moveToY = double.Parse(moves[2]);
- }
- }
- catch(FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid DRESSUPROOM MOVE packet (swf communication, INVALID LOCATION)");
- break;
- }
-
- Dressup.DressupPeice peice = room.GetDressupPeice(peiceId);
- // Update database entries
- peice.X = Convert.ToInt32(Math.Round(moveToX));
- peice.Y = Convert.ToInt32(Math.Round(moveToY));
- peice.Active = active;
-
- // Forward to other users
- byte[] movePeicePacket = PacketBuilder.CreateDressupRoomPeiceMove(peice.PeiceId, moveToX, moveToY, peice.Active);
- User[] users = GetUsersAt(sender.LoggedinUser.X, sender.LoggedinUser.Y, true, true);
- foreach(User user in users)
- {
- if (user.Id != sender.LoggedinUser.Id)
- user.LoggedinClient.SendPacket(movePeicePacket);
- }
- }
- break;
- case PacketBuilder.SWFMODULE_BANDHALL:
- byte[] response = PacketBuilder.CreateForwardedSwfRequest(packet);
- foreach (User user in GetUsersAt(sender.LoggedinUser.X, sender.LoggedinUser.Y))
- {
- if (user.Id == sender.LoggedinUser.Id)
- continue;
- user.LoggedinClient.SendPacket(response);
- }
- break;
- case PacketBuilder.SWFMODULE_2PLAYER:
- if(TwoPlayer.IsPlayerInGame(sender.LoggedinUser))
- {
- TwoPlayer twoPlayerGame = TwoPlayer.GetTwoPlayerGameInProgress(sender.LoggedinUser);
-
- User otherUser = null;
- if (twoPlayerGame.Invitee.Id == sender.LoggedinUser.Id)
- otherUser = twoPlayerGame.Inviting;
- else if (twoPlayerGame.Inviting.Id == sender.LoggedinUser.Id)
- otherUser = twoPlayerGame.Invitee;
-
- response = PacketBuilder.CreateForwardedSwfRequest(packet);
- otherUser.LoggedinClient.SendPacket(response);
- }
- break;
- case PacketBuilder.SWFMODULE_CLOSE:
- if (TwoPlayer.IsPlayerInGame(sender.LoggedinUser))
- {
- TwoPlayer twoPlayerGame = TwoPlayer.GetTwoPlayerGameInProgress(sender.LoggedinUser);
-
- User otherUser = null;
- if (twoPlayerGame.Invitee.Id == sender.LoggedinUser.Id)
- otherUser = twoPlayerGame.Inviting;
- else if (twoPlayerGame.Inviting.Id == sender.LoggedinUser.Id)
- otherUser = twoPlayerGame.Invitee;
-
- response = PacketBuilder.Create2PlayerClose();
- otherUser.LoggedinClient.SendPacket(response);
-
- twoPlayerGame.CloseGame(sender.LoggedinUser);
-
-
- }
- break;
- case PacketBuilder.SWFMODULE_ARENA:
- if (Arena.UserHasEnteredHorseInAnyArena(sender.LoggedinUser))
- {
- Arena arena = Arena.GetArenaUserEnteredIn(sender.LoggedinUser);
- response = PacketBuilder.CreateForwardedSwfRequest(packet);
- foreach (Arena.ArenaEntry entry in arena.Entries.ToArray())
- {
- if (entry.EnteredUser.Id == sender.LoggedinUser.Id)
- continue;
- if(entry.EnteredUser.LoggedinClient.LoggedIn)
- entry.EnteredUser.LoggedinClient.SendPacket(response);
- }
-
- }
- break;
- default:
- Logger.DebugPrint("Unknown moduleid : " + module + " packet dump: " + BitConverter.ToString(packet).Replace("-"," "));
- break;
-
- }
-
- }
-
- public static void OnWish(GameClient sender, byte[] packet)
- {
- if (!sender.LoggedIn)
- {
- Logger.ErrorPrint(sender.RemoteIp + " tried to wish when not logged in.");
- return;
- }
-
- if(packet.Length < 4)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid wish Packet");
- return;
- }
-
- if (!sender.LoggedinUser.Inventory.HasItemId(Item.WishingCoin))
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to use a wishing well while having 0 coins.");
- return;
- }
-
- InventoryItem wishingCoinInvItems = sender.LoggedinUser.Inventory.GetItemByItemId(Item.WishingCoin);
- byte wishType = packet[1];
- string message = "";
-
- byte[] chatMsg = PacketBuilder.CreateChat(Messages.TossedCoin, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatMsg);
-
- switch(wishType)
- {
- case PacketBuilder.WISH_MONEY:
- int gainMoney = RandomNumberGenerator.Next(500, 1000);
- sender.LoggedinUser.AddMoney(gainMoney);
- message = Messages.FormatWishMoneyMessage(gainMoney);
- break;
- case PacketBuilder.WISH_ITEMS:
- Item.ItemInformation[] wishableItmes = Item.GetAllWishableItems();
- int item = RandomNumberGenerator.Next(0, wishableItmes.Length);
- Item.ItemInformation itm = wishableItmes[item];
- item = RandomNumberGenerator.Next(0, wishableItmes.Length);
- Item.ItemInformation itm2 = wishableItmes[item];
-
- sender.LoggedinUser.Inventory.AddIgnoringFull(new ItemInstance(itm.Id));
- sender.LoggedinUser.Inventory.AddIgnoringFull(new ItemInstance(itm2.Id));
-
- message = Messages.FormatWishThingsMessage(itm.Name, itm2.Name);
- break;
- case PacketBuilder.WISH_WORLDPEACE:
- byte[] tooDeep = PacketBuilder.CreateChat(Messages.WorldPeaceOnlySoDeep, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(tooDeep);
-
- wishableItmes = Item.GetAllWishableItems();
- item = RandomNumberGenerator.Next(0, wishableItmes.Length);
- int earnMoney = RandomNumberGenerator.Next(0, 500);
- itm = wishableItmes[item];
-
-
- sender.LoggedinUser.AddMoney(earnMoney);
- sender.LoggedinUser.Inventory.AddIgnoringFull(new ItemInstance(itm.Id));
-
- message = Messages.FormatWishWorldPeaceMessage(earnMoney, itm.Name);
- break;
- default:
- Logger.ErrorPrint("Unknnown Wish type: " + wishType.ToString("X"));
- break;
- }
- sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.WishingWell).Count++;
-
- if(sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.WishingWell).Count >= 100)
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(30)); // Well Wisher
-
- if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.WishingWell).Count >= 1000)
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(31)); // Star Wisher
-
- if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.WishingWell).Count >= 10000)
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(51)); // Extraordanary Wisher
-
- byte[] msg = PacketBuilder.CreateChat(message, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(msg);
-
- sender.LoggedinUser.Inventory.Remove(wishingCoinInvItems.ItemInstances[0]);
- UpdateArea(sender);
- }
- public static void OnKeepAlive(GameClient sender, byte[] packet)
- {
- if (packet.Length < 2)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid update Packet");
- return;
- }
-
- if (packet[1] == PacketBuilder.PACKET_CLIENT_TERMINATOR)
- {
- Logger.DebugPrint("Received KEEP_ALIVE from: " + sender.LoggedinUser.Username);
- return;
- }
- }
- public static void OnStatsPacket(GameClient sender, byte[] packet)
- {
- if(!sender.LoggedIn)
- {
- Logger.ErrorPrint(sender.RemoteIp + " Requested stats when not logged in.");
- return;
- }
- if(packet.Length < 3)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + "Sent an invalid Stats Packet");
- return;
- }
-
-
- }
- public static void OnProfilePacket(GameClient sender, byte[] packet)
- {
- if (!sender.LoggedIn)
- {
- Logger.ErrorPrint(sender.RemoteIp + " Requested to change profile page when not logged in.");
- return;
- }
- if (packet.Length < 2)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid Profile Packet");
- return;
- }
-
- byte method = packet[1];
- if (method == PacketBuilder.PACKET_CLIENT_TERMINATOR)
- {
- UpdateStats(sender);
- }
- if (method == PacketBuilder.VIEW_PROFILE)
- {
- sender.LoggedinUser.MajorPriority = true;
- string profilePage = sender.LoggedinUser.ProfilePage;
- byte[] profilePacket = PacketBuilder.CreateProfilePacket(profilePage);
- sender.SendPacket(profilePacket);
- }
- else if (method == PacketBuilder.SAVE_PROFILE)
- {
-
- string packetStr = Encoding.UTF8.GetString(packet);
- if (packet.Length < 3 || !packetStr.Contains('|'))
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid Profile SAVE Packet");
- return;
- }
-
- int characterId = (packet[2] - 20) * 64 + (packet[3] - 20);
-
- string profilePage = packetStr.Split('|')[1];
- profilePage = profilePage.Substring(0, profilePage.Length - 2);
- sender.LoggedinUser.CharacterId = characterId;
-
-
-
- if (profilePage.Length > 4000)
- {
- byte[] notSaved = PacketBuilder.CreateChat(Messages.ProfileTooLongMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(notSaved);
- return;
- }
-
- object filterReason = Chat.FilterMessage(profilePage);
- if(filterReason != null)
- {
- Chat.Reason reason = (Chat.Reason)filterReason;
- byte[] msg = PacketBuilder.CreateChat(Messages.FormatProfileSavedBlocked(reason.Message), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(msg);
- return;
- }
-
- sender.LoggedinUser.ProfilePage = profilePage;
-
- Logger.DebugPrint(sender.LoggedinUser.Username + " Changed to character id: " + characterId + " and set there Profile Description to '" + profilePage + "'");
-
- byte[] chatPacket = PacketBuilder.CreateChat(Messages.ProfileSavedMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatPacket);
-
- UpdateArea(sender);
- UpdateUserFacingAndLocation(sender.LoggedinUser);
- }
- else if (method == PacketBuilder.SECCODE_AWARD)
- {
- byte[] ExpectedSecCode = sender.LoggedinUser.GenerateSecCode();
- byte[] GotSecCode = new byte[4];
- Array.ConstrainedCopy(packet, 2, GotSecCode, 0, GotSecCode.Length);
- Logger.DebugPrint(sender.LoggedinUser.Username + " Sent sec code: " + BitConverter.ToString(GotSecCode).Replace("-", " "));
- if (ExpectedSecCode.SequenceEqual(GotSecCode))
- {
- if (packet.Length < 6)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent a seccode AWARD request with invalid size");
- return;
- }
-
- string packetStr = Encoding.UTF8.GetString(packet);
- string awardIdStr = packetStr.Substring(6, packetStr.Length - 6 - 2);
-
- int value = -1;
- try
- {
- value = int.Parse(awardIdStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent correct sec code, but invalid awardid value");
- return;
- }
-
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(value));
- return;
- }
- else
- {
- byte[] errorMessage = PacketBuilder.CreateChat(Messages.InvalidSecCodeError, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(errorMessage);
- Logger.HackerPrint(sender.LoggedinUser.Username + " Sent invalid sec code");
- return;
- }
- }
- else if (method == PacketBuilder.SECCODE_SCORE || method == PacketBuilder.SECCODE_TIME || method == PacketBuilder.SECCODE_WINLOOSE)
- {
- bool time = (method == PacketBuilder.SECCODE_TIME);
- bool winloose = (method == PacketBuilder.SECCODE_WINLOOSE);
-
- byte[] ExpectedSecCode = sender.LoggedinUser.GenerateSecCode();
- byte[] GotSecCode = new byte[4];
- Array.ConstrainedCopy(packet, 2, GotSecCode, 0, GotSecCode.Length);
- Logger.DebugPrint(sender.LoggedinUser.Username + " Sent sec code: " + BitConverter.ToString(GotSecCode).Replace("-", " "));
- if (ExpectedSecCode.SequenceEqual(GotSecCode))
- {
- if (packet.Length < 6)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent a seccode score/time/winloose request with invalid size");
- return;
- }
-
-
- string packetStr = Encoding.UTF8.GetString(packet);
- string gameInfoStr = packetStr.Substring(6, packetStr.Length - 6 - 2);
- if (winloose)
- {
- string gameTitle = gameInfoStr.Substring(1);
- byte pmethod = packet[6];
- if(pmethod == PacketBuilder.WINLOOSE_WIN)
- {
- sender.LoggedinUser.Highscores.Win(gameTitle);
- byte[] winMsg = PacketBuilder.CreateChat(Messages.Format2PlayerRecordWin(gameTitle), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(winMsg);
- }
- else if(pmethod == PacketBuilder.WINLOOSE_LOOSE)
- {
- sender.LoggedinUser.Highscores.Loose(gameTitle);
- byte[] looseMsg = PacketBuilder.CreateChat(Messages.Format2PlayerRecordLose(gameTitle), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(looseMsg);
- }
-
- if (sender.LoggedinUser.Highscores.HighscoreList.Length >= 30)
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(12)); // Minigame Player
-
- if (sender.LoggedinUser.Highscores.HighscoreList.Length >= 60)
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(13)); // Minigame Master
-
- if (Database.GetPlayerTotalMinigamesPlayed(sender.LoggedinUser.Id) >= 1000)
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(14)); // Minigame Nut
-
- if (Database.GetPlayerTotalMinigamesPlayed(sender.LoggedinUser.Id) >= 10000)
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(15)); // Minigame Crazy
- return;
- }
- if (gameInfoStr.Contains("|"))
- {
- string[] gameInfo = gameInfoStr.Split('|');
- if (gameInfo.Length < 2)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent a invalid seccode score request");
- return;
- }
-
- string gameTitle = gameInfo[0];
- string gameScoreStr = gameInfo[1];
-
- int value = -1;
- try
- {
- value = int.Parse(gameScoreStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent correct sec code, but invalid score value");
- return;
- }
- Highscore.HighscoreTableEntry[] scores = Database.GetTopScores(gameTitle, 5, !time);
- bool bestScoreEver = false;
- if (scores.Length >= 1)
- bestScoreEver = scores[0].Score <= value;
-
- bool newHighscore = sender.LoggedinUser.Highscores.UpdateHighscore(gameTitle, value, time);
- if(bestScoreEver && !time)
- {
- byte[] bestScoreBeaten = PacketBuilder.CreateChat(Messages.BeatBestHighscore, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(bestScoreBeaten);
- sender.LoggedinUser.AddMoney(2500);
- }
- else if (newHighscore)
- {
- if(time)
- {
- byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatTimeBeatenMessage(value), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatPacket);
- }
- else
- {
- byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatHighscoreBeatenMessage(value), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatPacket);
- }
-
- }
-
- if(sender.LoggedinUser.Highscores.HighscoreList.Length >= 30)
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(12)); // Minigame Player
-
- if (sender.LoggedinUser.Highscores.HighscoreList.Length >= 60)
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(13)); // Minigame Master
-
- if (Database.GetPlayerTotalMinigamesPlayed(sender.LoggedinUser.Id) >= 1000)
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(14)); // Minigame Nut
-
- if (Database.GetPlayerTotalMinigamesPlayed(sender.LoggedinUser.Id) >= 10000)
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(15)); // Minigame Crazy
-
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " didnt send a game name AND a score.");
- return;
- }
-
- }
- else
- {
- byte[] errorMessage = PacketBuilder.CreateChat(Messages.InvalidSecCodeError, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(errorMessage);
- Logger.HackerPrint(sender.LoggedinUser.Username + " Sent invalid sec code");
- return;
- }
- }
- else if (method == PacketBuilder.SECCODE_MONEY)
- {
-
- byte[] ExpectedSecCode = sender.LoggedinUser.GenerateSecCode();
- byte[] GotSecCode = new byte[4];
- Array.ConstrainedCopy(packet, 2, GotSecCode, 0, GotSecCode.Length);
- Logger.DebugPrint(sender.LoggedinUser.Username + " Sent sec code: " + BitConverter.ToString(GotSecCode).Replace("-", " "));
- if (ExpectedSecCode.SequenceEqual(GotSecCode))
- {
- if (packet.Length < 6)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent a seccode money request with invalid size");
- return;
- }
-
- string packetStr = Encoding.UTF8.GetString(packet);
- string gameInfoStr = packetStr.Substring(6, packetStr.Length - 6 - 2);
- if (gameInfoStr.Contains("|"))
- {
- string[] moneyInfo = gameInfoStr.Split('|');
- if (moneyInfo.Length < 2)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent a invalid money score request");
- return;
- }
-
- string id = moneyInfo[0]; // not sure what this is for?
-
- string moneyStr = moneyInfo[1];
- int value = -1;
- try
- {
- value = int.Parse(moneyStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent correct sec code, but invalid money value");
- return;
- }
-
- int moneyEarned = value * 10;
- Logger.InfoPrint(sender.LoggedinUser.Username + " Earned $" + moneyEarned + " In: " + id);
-
- sender.LoggedinUser.AddMoney(moneyEarned);
- byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatMoneyEarnedMessage(moneyEarned), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatPacket);
-
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " didnt send a game name AND a score.");
- return;
- }
-
- }
- }
- else if (method == PacketBuilder.SECCODE_GIVE_ITEM)
- {
- byte[] ExpectedSecCode = sender.LoggedinUser.GenerateSecCode();
- byte[] GotSecCode = new byte[4];
- Array.ConstrainedCopy(packet, 2, GotSecCode, 0, GotSecCode.Length);
- Logger.DebugPrint(sender.LoggedinUser.Username + " Sent sec code: " + BitConverter.ToString(GotSecCode).Replace("-", " "));
- if (ExpectedSecCode.SequenceEqual(GotSecCode))
- {
- if (packet.Length < 6)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent a seccode item request with invalid size");
- return;
- }
- string packetStr = Encoding.UTF8.GetString(packet);
- string intStr = packetStr.Substring(6, packetStr.Length - 6 - 2);
- int value = -1;
- try
- {
- value = int.Parse(intStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent correct sec code, but invalid value");
- return;
- }
-
-
- if (Item.ItemIdExist(value))
- {
- ItemInstance itm = new ItemInstance(value);
-
- Item.ItemInformation itemInfo = Item.GetItemById(value);
- string messageToSend = Messages.FormatYouEarnedAnItemMessage(itemInfo.Name);
- try
- {
- sender.LoggedinUser.Inventory.Add(itm);
- }
- catch(InventoryException)
- {
- messageToSend = Messages.FormatYouEarnedAnItemButInventoryFullMessage(itemInfo.Name);
- }
-
- byte[] earnedItemMessage = PacketBuilder.CreateChat(messageToSend, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(earnedItemMessage);
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Sent correct sec code, but tried to give an non existant item");
- return;
- }
-
- }
- else
- {
- byte[] errorMessage = PacketBuilder.CreateChat(Messages.InvalidSecCodeError, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(errorMessage);
- Logger.HackerPrint(sender.LoggedinUser.Username + " Sent invalid sec code");
- return;
- }
- }
- else if (method == PacketBuilder.SECCODE_DELETE_ITEM)
- {
- byte[] ExpectedSecCode = sender.LoggedinUser.GenerateSecCode();
- byte[] GotSecCode = new byte[4];
- Array.ConstrainedCopy(packet, 2, GotSecCode, 0, GotSecCode.Length);
- Logger.DebugPrint(sender.LoggedinUser.Username + " Sent sec code: " + BitConverter.ToString(GotSecCode).Replace("-", " "));
- if (ExpectedSecCode.SequenceEqual(GotSecCode))
- {
- if (packet.Length < 6)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent a seccode item request with invalid size");
- return;
- }
- string packetStr = Encoding.UTF8.GetString(packet);
- string intStr = packetStr.Substring(6, packetStr.Length - 6 - 2);
- int value = -1;
- try
- {
- value = int.Parse(intStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent correct sec code, but invalid value");
- return;
- }
-
-
- if (sender.LoggedinUser.Inventory.HasItemId(value))
- {
- InventoryItem item = sender.LoggedinUser.Inventory.GetItemByItemId(value);
- sender.LoggedinUser.Inventory.Remove(item.ItemInstances[0]);
-
- Item.ItemInformation itemInfo = Item.GetItemById(value);
- byte[] lostItemMessage = PacketBuilder.CreateChat(Messages.FormatYouLostAnItemMessage(itemInfo.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(lostItemMessage);
-
- UpdateArea(sender);
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Sent correct sec code, but tried to delete an non existant item");
- return;
- }
-
- }
- else
- {
- byte[] errorMessage = PacketBuilder.CreateChat(Messages.InvalidSecCodeError, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(errorMessage);
- Logger.HackerPrint(sender.LoggedinUser.Username + " Sent invalid sec code");
- return;
- }
- }
- else if (method == PacketBuilder.SECCODE_QUEST)
- {
- byte[] ExpectedSecCode = sender.LoggedinUser.GenerateSecCode();
- byte[] GotSecCode = new byte[4];
- Array.ConstrainedCopy(packet, 2, GotSecCode, 0, GotSecCode.Length);
- Logger.DebugPrint(sender.LoggedinUser.Username + " Sent sec code: " + BitConverter.ToString(GotSecCode).Replace("-", " "));
- if (ExpectedSecCode.SequenceEqual(GotSecCode))
- {
- if (packet.Length < 6)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent a seccode quest request with invalid size");
- return;
- }
- string packetStr = Encoding.UTF8.GetString(packet);
- string intStr = packetStr.Substring(6, packetStr.Length - 6 - 2);
- int value = -1;
- try
- {
- value = int.Parse(intStr);
- }
- catch (FormatException)
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Sent correct sec code, but invalid value");
- return;
- }
-
-
- if (Quest.DoesQuestExist(value))
- {
- Quest.QuestEntry questEntry = Quest.GetQuestById(value);
- Quest.ActivateQuest(sender.LoggedinUser, questEntry);
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Sent correct sec code, but tried to activate a non existant quest");
- return;
- }
-
-
- }
- else
- {
- byte[] errorMessage = PacketBuilder.CreateChat(Messages.InvalidSecCodeError, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(errorMessage);
- Logger.HackerPrint(sender.LoggedinUser.Username + " Sent invalid sec code");
- return;
- }
- }
- else if (method == PacketBuilder.PROFILE_HIGHSCORES_LIST)
- {
- sender.LoggedinUser.MajorPriority = true;
- string packetStr = Encoding.UTF8.GetString(packet);
- string gameName = packetStr.Substring(2, packetStr.Length - 4);
- byte[] metaTag = PacketBuilder.CreateMetaPacket(Meta.BuildTopHighscores(gameName));
- sender.SendPacket(metaTag);
- }
- else if (method == PacketBuilder.PROFILE_BESTTIMES_LIST)
- {
- sender.LoggedinUser.MajorPriority = true;
- string packetStr = Encoding.UTF8.GetString(packet);
- string gameName = packetStr.Substring(2, packetStr.Length - 4);
- byte[] metaTag = PacketBuilder.CreateMetaPacket(Meta.BuildTopTimes(gameName));
- sender.SendPacket(metaTag);
- }
- else if (method == PacketBuilder.PROFILE_WINLOOSE_LIST)
- {
- sender.LoggedinUser.MajorPriority = true;
- string packetStr = Encoding.UTF8.GetString(packet);
- string gameName = packetStr.Substring(2, packetStr.Length - 4);
- byte[] metaTag = PacketBuilder.CreateMetaPacket(Meta.BuildTopWinners(gameName));
- sender.SendPacket(metaTag);
- }
- else
- {
- Logger.DebugPrint("Unknown Profile Packet! " + BitConverter.ToString(packet).Replace("-", " "));
- }
- }
- public static void OnMovementPacket(GameClient sender, byte[] packet)
- {
- if (!sender.LoggedIn)
- {
- Logger.ErrorPrint(sender.RemoteIp + " Sent movement packet when not logged in.");
- return;
- }
-
-
- User loggedInUser = sender.LoggedinUser;
-
- /*
- * Player stuff
- */
-
- // Store this for later... do it now to avoid TOCTOU.
- User[] onScreenBefore = GetOnScreenUsers(loggedInUser.X, loggedInUser.Y, true, true);
-
- // Leave Multirooms
- Multiroom.LeaveAllMultirooms(loggedInUser);
-
- loggedInUser.PendingBuddyRequestTo = null;
-
- // Close Social Windows
- foreach (User sUser in loggedInUser.BeingSocializedBy)
- UpdateArea(sUser.LoggedinClient);
- loggedInUser.ClearSocailizedWith();
-
-
- if (loggedInUser.CurrentlyRidingHorse != null)
- {
- if(loggedInUser.CurrentlyRidingHorse.BasicStats.Experience < 25)
- {
- if(GameServer.RandomNumberGenerator.Next(0, 100) >= 97 || sender.LoggedinUser.Username.ToLower() == "dream")
- {
- loggedInUser.CurrentlyRidingHorse.BasicStats.Experience++;
- byte[] horseBuckedMessage;
- if(loggedInUser.CurrentlyRidingHorse.Breed.Type == "llama")
- horseBuckedMessage = PacketBuilder.CreateChat(Messages.HorseLlamaBuckedYou, PacketBuilder.CHAT_BOTTOM_RIGHT);
- else if (loggedInUser.CurrentlyRidingHorse.Breed.Type == "camel")
- horseBuckedMessage = PacketBuilder.CreateChat(Messages.HorseCamelBuckedYou, PacketBuilder.CHAT_BOTTOM_RIGHT);
- else
- horseBuckedMessage = PacketBuilder.CreateChat(Messages.HorseBuckedYou, PacketBuilder.CHAT_BOTTOM_RIGHT);
-
- sender.LoggedinUser.CurrentlyRidingHorse = null;
- sender.LoggedinUser.Facing %= 5;
- sender.SendPacket(horseBuckedMessage);
- }
- }
- }
-
- // Randomly move if thirst, hunger, tiredness too low-
-
- byte movementDirection = packet[1];
-
- if (loggedInUser.Thirst <= 0 || loggedInUser.Hunger <= 0 || loggedInUser.Tiredness <= 0)
- {
- if (RandomNumberGenerator.Next(0, 10) == 7)
- {
- byte[] possibleDirections = new byte[] { PacketBuilder.MOVE_UP, PacketBuilder.MOVE_DOWN, PacketBuilder.MOVE_RIGHT, PacketBuilder.MOVE_LEFT };
-
- if (possibleDirections.Contains(movementDirection))
- {
- byte newDirection = possibleDirections[RandomNumberGenerator.Next(0, possibleDirections.Length)];
- if (newDirection != movementDirection)
- {
- movementDirection = newDirection;
- if (loggedInUser.Thirst <= 0)
- {
- byte[] chatMessage = PacketBuilder.CreateChat(Messages.FormatRandomMovementMessage(Messages.StatThirst.ToUpper(), Messages.StatThirstDizzy), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatMessage);
- }
- else if (loggedInUser.Hunger <= 0)
- {
- byte[] chatMessage = PacketBuilder.CreateChat(Messages.FormatRandomMovementMessage(Messages.StatHunger.ToUpper(), Messages.StatHungerStumble), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatMessage);
- }
- /*
- * Doesnt appear to acturally exist.
- *
- else if (loggedInUser.Tiredness <= 0)
- {
- byte[] chatMessage = PacketBuilder.CreateChat(Messages.FormatRandomMovementMessage(Messages.StatTired.ToUpper()), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatMessage);
- }
- */
- }
- }
- }
- }
-
-
-
- int onHorse = 0;
- int facing = sender.LoggedinUser.Facing;
- while (facing >= 5)
- {
- facing -= 5;
- onHorse++;
- }
- byte direction = 0;
- int newX = loggedInUser.X;
- int newY = loggedInUser.Y;
-
-
- bool moveTwo = false;
-
- if (movementDirection == PacketBuilder.MOVE_ESCAPE) // Exit this place / X Button
- {
-
- byte Direction;
- if (World.InSpecialTile(loggedInUser.X, loggedInUser.Y))
- {
-
- World.SpecialTile tile = World.GetSpecialTile(loggedInUser.X, loggedInUser.Y);
- if (tile.ExitX != 0)
- newX = tile.ExitX;
- if (tile.ExitY != 0)
- newY = tile.ExitY;
- else
- if (Map.CheckPassable(loggedInUser.X, loggedInUser.Y + 1) || loggedInUser.NoClip)
- newY += 1;
-
-
-
- if (loggedInUser.X + 1 == newX && loggedInUser.Y == newY)
- Direction = PacketBuilder.DIRECTION_RIGHT;
- else if (loggedInUser.X - 1 == newX && loggedInUser.Y == newY)
- Direction = PacketBuilder.DIRECTION_LEFT;
- else if (loggedInUser.Y + 1 == newY && loggedInUser.X == newX)
- Direction = PacketBuilder.DIRECTION_DOWN;
- else if (loggedInUser.Y - 1 == newY && loggedInUser.X == newX)
- Direction = PacketBuilder.DIRECTION_UP;
- else
- Direction = PacketBuilder.DIRECTION_TELEPORT;
-
- loggedInUser.X = newX;
- loggedInUser.Y = newY;
-
-
- }
- else
- {
- if (Map.CheckPassable(loggedInUser.X, loggedInUser.Y + 1) || loggedInUser.NoClip)
- loggedInUser.Y += 1;
-
- Direction = PacketBuilder.DIRECTION_DOWN;
- }
-
- loggedInUser.Facing = Direction + (onHorse * 5);
- Logger.DebugPrint("Exiting player: " + loggedInUser.Username + " to: " + loggedInUser.X + "," + loggedInUser.Y);
- byte[] moveResponse = PacketBuilder.CreateMovementPacket(loggedInUser.X, loggedInUser.Y, loggedInUser.CharacterId, loggedInUser.Facing, Direction, true);
- sender.SendPacket(moveResponse);
- goto Complete;
- }
-
- if (movementDirection == PacketBuilder.MOVE_UP)
- {
- direction = PacketBuilder.DIRECTION_UP;
- if (Map.CheckPassable(newX, newY - 1) || loggedInUser.NoClip)
- newY -= 1;
-
-
- if (loggedInUser.Facing == (direction + (onHorse * 5)) && loggedInUser.CurrentlyRidingHorse != null && !World.InTown(loggedInUser.X, loggedInUser.Y)) // Double move
- if (Map.CheckPassable(newX, newY - 1) || loggedInUser.NoClip)
- {
- newY -= 1;
- moveTwo = true;
- }
- }
- else if (movementDirection == PacketBuilder.MOVE_LEFT)
- {
- direction = PacketBuilder.DIRECTION_LEFT;
- if (Map.CheckPassable(newX - 1, newY) || loggedInUser.NoClip)
- newX -= 1;
-
-
- if (loggedInUser.Facing == (direction + (onHorse * 5)) && loggedInUser.CurrentlyRidingHorse != null && !World.InTown(loggedInUser.X, loggedInUser.Y)) // Double move
- if (Map.CheckPassable(newX - 1, newY) || loggedInUser.NoClip)
- {
- newX -= 1;
- moveTwo = true;
- }
- }
- else if (movementDirection == PacketBuilder.MOVE_RIGHT)
- {
- direction = PacketBuilder.DIRECTION_RIGHT;
- if (Map.CheckPassable(newX + 1, newY) || loggedInUser.NoClip)
- newX += 1;
-
-
- if (loggedInUser.Facing == (direction + (onHorse * 5)) && loggedInUser.CurrentlyRidingHorse != null && !World.InTown(loggedInUser.X, loggedInUser.Y)) // Double move
- if (Map.CheckPassable(newX + 1, newY) || loggedInUser.NoClip)
- {
- newX += 1;
- moveTwo = true;
- }
- }
- else if (movementDirection == PacketBuilder.MOVE_DOWN)
- {
- direction = PacketBuilder.DIRECTION_DOWN;
- if (Map.CheckPassable(newX, newY + 1) || loggedInUser.NoClip)
- newY += 1;
-
-
- if (loggedInUser.Facing == (direction + (onHorse * 5)) && loggedInUser.CurrentlyRidingHorse != null && !World.InTown(loggedInUser.X, loggedInUser.Y)) // Double move
- if (Map.CheckPassable(newX, newY + 1) || loggedInUser.NoClip)
- {
- newY += 1;
- moveTwo = true;
- }
- }
- else if(movementDirection == PacketBuilder.MOVE_UPDATE)
- {
- UpdateArea(sender);
- return;
- }
-
-
-
- loggedInUser.Facing = direction + (onHorse * 5);
- if (loggedInUser.Y != newY || loggedInUser.X != newX)
- {
- if (moveTwo)
- direction += 20;
-
- loggedInUser.Y = newY;
- loggedInUser.X = newX;
-
- // Check Treasures
- if (Treasure.IsTileTreasure(loggedInUser.X, loggedInUser.Y))
- {
- Treasure treasure = Treasure.GetTreasureAt(loggedInUser.X, loggedInUser.Y);
- if (treasure.Type == "RAINBOW")
- {
- treasure.CollectTreasure(loggedInUser);
- goto Complete;
- }
- }
-
- byte[] moveResponse = PacketBuilder.CreateMovementPacket(loggedInUser.X, loggedInUser.Y, loggedInUser.CharacterId, loggedInUser.Facing, direction, true);
- sender.SendPacket(moveResponse);
- }
- else
- {
- byte[] moveResponse = PacketBuilder.CreateMovementPacket(loggedInUser.X, loggedInUser.Y, loggedInUser.CharacterId, loggedInUser.Facing, PacketBuilder.DIRECTION_NONE, false);
- sender.SendPacket(moveResponse);
- }
- Complete:;
-
- // Cancel Trades
- if (loggedInUser.TradingWith != null)
- if ((loggedInUser.TradingWith.Trader.X != loggedInUser.X) && (loggedInUser.TradingWith.Trader.Y != loggedInUser.Y))
- loggedInUser.TradingWith.CancelTradeMoved();
-
- // Pac-man the world.
- if (loggedInUser.X > Map.Width)
- loggedInUser.Teleport(2, loggedInUser.Y);
- else if (loggedInUser.X < 2)
- loggedInUser.Teleport(Map.Width - 2, loggedInUser.Y);
- else if (loggedInUser.Y > Map.Height - 2)
- loggedInUser.Teleport(loggedInUser.X, 2);
- else if (loggedInUser.Y < 2)
- loggedInUser.Teleport(loggedInUser.X, Map.Height - 2);
-
-
- User[] onScreenNow = GetOnScreenUsers(loggedInUser.X, loggedInUser.Y, true, true);
-
- User[] goneOffScreen = onScreenBefore.Except(onScreenNow).ToArray();
- User[] goneOnScreen = onScreenNow.Except(onScreenBefore).ToArray();
-
- foreach (User offScreenUsers in goneOffScreen)
- {
- if (offScreenUsers.Id == loggedInUser.Id)
- continue;
-
- byte[] playerInfoBytes = PacketBuilder.CreatePlayerInfoUpdateOrCreate(1000 + 4, 1000 + 1, loggedInUser.Facing, loggedInUser.CharacterId, loggedInUser.Username);
- offScreenUsers.LoggedinClient.SendPacket(playerInfoBytes);
- }
-
- foreach (User onScreenUsers in goneOnScreen)
- {
- if (onScreenUsers.Id == loggedInUser.Id)
- continue;
-
- byte[] playerInfoBytes = PacketBuilder.CreatePlayerInfoUpdateOrCreate(onScreenUsers.X, onScreenUsers.Y, onScreenUsers.Facing, onScreenUsers.CharacterId, onScreenUsers.Username);
- loggedInUser.LoggedinClient.SendPacket(playerInfoBytes);
- }
-
- Update(sender);
-
- }
- public static void OnQuitPacket(GameClient sender, byte[] packet)
- {
- if(!sender.LoggedIn)
- {
- Logger.ErrorPrint(sender.RemoteIp + " Sent quit packet when not logged in.");
- return;
- }
- Logger.InfoPrint(sender.LoggedinUser.Username + " Clicked \"Quit Game\".. Disconnecting");
- sender.Disconnect();
- }
- public static void OnNpcInteraction(GameClient sender, byte[] packet)
- {
- if (!sender.LoggedIn)
- {
- Logger.ErrorPrint(sender.RemoteIp + " Sent npc interaction packet when not logged in.");
- return;
- }
- if (packet.Length < 3)
- {
- Logger.ErrorPrint(sender.RemoteIp + " Sent an invalid npc interaction packet.");
- return;
- }
- byte action = packet[1];
- if (action == PacketBuilder.NPC_START_CHAT)
- {
-
- string packetStr = Encoding.UTF8.GetString(packet);
- string number = packetStr.Substring(2, packetStr.Length - 4);
- int chatId = 0;
-
- try
- {
- chatId = int.Parse(number);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to start talking to an NPC with id that is NaN.");
- return;
- }
- if(!Npc.NpcExists(chatId))
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to start talking to an NPC that doesnt exist.");
- return;
- }
- sender.LoggedinUser.MajorPriority = true;
- Npc.NpcEntry entry = Npc.GetNpcById(chatId);
-
- if(entry.Chatpoints.Length <= 0)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to start talking to an NPC with no chatpoints.");
- return;
- }
-
- int defaultChatpointId = Npc.GetDefaultChatpoint(sender.LoggedinUser, entry);
- Npc.NpcChat startingChatpoint = Npc.GetNpcChatpoint(entry, defaultChatpointId);
-
- string metaInfo = Meta.BuildNpcChatpoint(sender.LoggedinUser, entry, startingChatpoint);
- byte[] metaPacket = PacketBuilder.CreateMetaPacket(metaInfo);
- sender.SendPacket(metaPacket);
-
- sender.LoggedinUser.LastTalkedToNpc = entry;
- }
- else if (action == PacketBuilder.NPC_CONTINUE_CHAT)
- {
- string packetStr = Encoding.UTF8.GetString(packet);
- string number = packetStr.Substring(2, packetStr.Length - 4);
- int replyId = 0;
- try
- {
- replyId = int.Parse(number);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to reply to an NPC with replyid that is NaN.");
- return;
- }
-
- Npc.NpcEntry lastNpc = sender.LoggedinUser.LastTalkedToNpc;
- Npc.NpcReply reply;
- try
- {
- reply = Npc.GetNpcReply(lastNpc, replyId);
- }
- catch(KeyNotFoundException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to reply with replyid that does not exist.");
- return;
- }
-
- if (reply.GotoChatpoint == -1)
- {
- UpdateArea(sender);
- return;
- }
- sender.LoggedinUser.MajorPriority = true;
- string metaInfo = Meta.BuildNpcChatpoint(sender.LoggedinUser, lastNpc, Npc.GetNpcChatpoint(lastNpc, reply.GotoChatpoint));
- byte[] metaPacket = PacketBuilder.CreateMetaPacket(metaInfo);
- sender.SendPacket(metaPacket);
- return;
- }
- }
- public static void OnTransportUsed(GameClient sender, byte[] packet)
- {
- if (!sender.LoggedIn)
- {
- Logger.ErrorPrint(sender.RemoteIp + " Sent transport packet when not logged in.");
- return;
- }
- if (packet.Length < 3)
- {
- Logger.ErrorPrint(sender.RemoteIp + " Sent an invalid transport packet.");
- return;
- }
-
-
- string packetStr = Encoding.UTF8.GetString(packet);
- string number = packetStr.Substring(1, packetStr.Length - 3);
-
- int transportid;
- try
- {
- transportid = Int32.Parse(number);
- }
- catch(FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to use a transport with id that is NaN.");
- return;
- }
- try
- {
- Transport.TransportPoint transportPoint = Transport.GetTransportPoint(sender.LoggedinUser.X, sender.LoggedinUser.Y);
- if (transportPoint.X != sender.LoggedinUser.X && transportPoint.Y != sender.LoggedinUser.Y)
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to use transport id: " + transportid.ToString() + " while not the correct transport point!");
- return;
- }
-
- Transport.TransportLocation transportLocation = Transport.GetTransportLocation(transportid);
- int cost = transportLocation.Cost;
-
- if (transportLocation.Type == "WAGON")
- {
- if(sender.LoggedinUser.OwnedRanch != null)
- {
- if(sender.LoggedinUser.OwnedRanch.GetBuildingCount(7) > 0) // Wagon
- {
- cost = 0;
- }
- }
- }
-
- if (sender.LoggedinUser.Bids.Length > 0)
- {
- byte[] cantBuyWhileAuctioning = PacketBuilder.CreateChat(Messages.AuctionNoOtherTransactionAllowed, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantBuyWhileAuctioning);
- return;
- }
-
-
- if (sender.LoggedinUser.Money >= cost)
- {
- string swfToLoad = Messages.BoatCutscene;
- if (transportLocation.Type == "WAGON")
- swfToLoad = Messages.WagonCutscene;
-
- if (transportLocation.Type != "ROWBOAT")
- {
- byte[] swfModulePacket = PacketBuilder.CreateSwfModulePacket(swfToLoad, PacketBuilder.PACKET_SWF_CUTSCENE);
- sender.SendPacket(swfModulePacket);
- }
-
- sender.LoggedinUser.Teleport(transportLocation.GotoX, transportLocation.GotoY);
- sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.Transport).Count++;
-
-
- if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.Transport).Count >= 500)
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(27)); // Traveller
- if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.Transport).Count >= 5000)
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(28)); // Globetrotter
-
- byte[] welcomeToIslePacket = PacketBuilder.CreateChat(Messages.FormatWelcomeToAreaMessage(transportLocation.LocationTitle), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(welcomeToIslePacket);
-
- if(cost > 0)
- sender.LoggedinUser.TakeMoney(cost);
- }
- else
- {
- byte[] cantAfford = PacketBuilder.CreateChat(Messages.CantAffordTransport, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantAfford);
- }
- }
- catch (KeyNotFoundException)
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to use transport id: " + transportid.ToString() + " while not on a transport point!");
- }
-
-
- }
- public static void OnRanchPacket(GameClient sender, byte[] packet)
- {
- if (!sender.LoggedIn)
- {
- Logger.ErrorPrint(sender.RemoteIp + " Sent ranch packet when not logged in.");
- return;
- }
- if (packet.Length < 4)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid ranch packet.");
- return;
- }
- string packetStr = Encoding.UTF8.GetString(packet);
- byte method = packet[1];
-
- if (method == PacketBuilder.RANCH_INFO)
- {
- string buildingIdStr = packetStr.Substring(2, packetStr.Length - 4);
- int buildingId = 0;
- try
- {
- buildingId = int.Parse(buildingIdStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to get info for building id NaN");
- return;
- }
- if (Ranch.RanchBuilding.RanchBuildingExists(buildingId))
- {
- Ranch.RanchBuilding building = Ranch.RanchBuilding.GetRanchBuildingById(buildingId);
-
- byte[] ranchBuild = PacketBuilder.CreateChat(Messages.FormatBuildingInformaton(building.Title, building.Description), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(ranchBuild);
-
- return;
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to get info for building id that didnt exist.");
- return;
- }
- }
- else if (method == PacketBuilder.RANCH_SELL)
- {
- string NanSTR = packetStr.Substring(2, packetStr.Length - 4);
- if (NanSTR == "NaN")
- {
- if (sender.LoggedinUser.OwnedRanch == null)
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to sell there ranch when they didnt own one.");
- return;
- }
- int sellPrice = sender.LoggedinUser.OwnedRanch.GetSellPrice();
- sender.LoggedinUser.AddMoney(sellPrice);
- byte[] sellPacket = PacketBuilder.CreateChat(Messages.FormatRanchSoldMessage(sellPrice), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.LoggedinUser.OwnedRanch.OwnerId = -1;
- sender.SendPacket(sellPacket);
-
- // Change map sprite.
- User[] users = GetUsersAt(sender.LoggedinUser.X, sender.LoggedinUser.Y, true, true);
- foreach (User user in users)
- {
- byte[] MovementPacket = PacketBuilder.CreateMovementPacket(user.X, user.Y, user.CharacterId, user.Facing, PacketBuilder.DIRECTION_TELEPORT, true);
- user.LoggedinClient.SendPacket(MovementPacket);
- }
- UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y, true);
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to sell there ranch without sending NaN.");
- return;
- }
- }
- else if (method == PacketBuilder.RANCH_UPGRADE)
- {
- string NanSTR = packetStr.Substring(2, packetStr.Length - 4);
- if (NanSTR == "NaN")
- {
- if (sender.LoggedinUser.OwnedRanch != null)
- {
- Ranch.RanchUpgrade currentUpgrade = sender.LoggedinUser.OwnedRanch.GetRanchUpgrade();
-
- if (!Ranch.RanchUpgrade.RanchUpgradeExists(currentUpgrade.Id + 1))
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to upgrade there ranch when it was max upgrade.");
- return;
- }
-
- Ranch.RanchUpgrade nextUpgrade = Ranch.RanchUpgrade.GetRanchUpgradeById(currentUpgrade.Id + 1);
- if (sender.LoggedinUser.Money >= nextUpgrade.Cost)
- {
- sender.LoggedinUser.TakeMoney(nextUpgrade.Cost);
- sender.LoggedinUser.OwnedRanch.InvestedMoney += nextUpgrade.Cost;
- sender.LoggedinUser.OwnedRanch.UpgradedLevel++;
-
- byte[] upgraded = PacketBuilder.CreateChat(Messages.UpgradedMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(upgraded);
-
- // Change map sprite.
- User[] users = GetUsersAt(sender.LoggedinUser.X, sender.LoggedinUser.Y, true, true);
- foreach (User user in users)
- {
- byte[] MovementPacket = PacketBuilder.CreateMovementPacket(user.X, user.Y, user.CharacterId, user.Facing, PacketBuilder.DIRECTION_TELEPORT, true);
- user.LoggedinClient.SendPacket(MovementPacket);
- }
- UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y, true);
- }
- else
- {
- byte[] cantAfford = PacketBuilder.CreateChat(Messages.UpgradeCannotAfford, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantAfford);
- }
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to upgrade there ranch when they didnt own one.");
- }
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to upgrade there ranch without sending NaN.");
- return;
- }
- }
- else if (method == PacketBuilder.RANCH_REMOVE)
- {
- string buildingIdStr = packetStr.Substring(2, packetStr.Length - 4);
- int buildingId = 0;
- try
- {
- buildingId = int.Parse(buildingIdStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to get info for building id NaN");
- return;
- }
- if (Ranch.RanchBuilding.RanchBuildingExists(buildingId))
- {
- Ranch.RanchBuilding building = Ranch.RanchBuilding.GetRanchBuildingById(buildingId);
- int ranchBuild = sender.LoggedinUser.LastClickedRanchBuilding;
- if (ranchBuild <= 0)
- return;
- if (sender.LoggedinUser.OwnedRanch != null)
- {
- if (ranchBuild > sender.LoggedinUser.OwnedRanch.GetRanchUpgrade().Limit)
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to remove more buildings than the limit.");
- return;
- }
-
- Ranch.RanchBuilding ranchBuilding = sender.LoggedinUser.OwnedRanch.GetBuilding(ranchBuild - 1);
-
- if (ranchBuilding == null)
- return;
-
- if (ranchBuilding.Id == buildingId)
- {
- sender.LoggedinUser.OwnedRanch.SetBuilding(ranchBuild - 1, null);
- sender.LoggedinUser.AddMoney(ranchBuilding.GetTeardownPrice());
- sender.LoggedinUser.OwnedRanch.InvestedMoney -= building.Cost;
- byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatBuildingTornDown(ranchBuilding.GetTeardownPrice()), PacketBuilder.CHAT_BOTTOM_RIGHT);
-
- sender.SendPacket(chatPacket);
- UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y, true);
- return;
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to remove bulidingid: " + buildingId + " from building slot " + ranchBuild + " but the building was not found there.");
- }
-
- }
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to remove in a ranch when they dont own one.");
- return;
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to get info for building id that didnt exist.");
- return;
- }
- }
- else if (method == PacketBuilder.RANCH_BUILD)
- {
- string buildingIdStr = packetStr.Substring(2, packetStr.Length - 4);
- int buildingId = 0;
- try
- {
- buildingId = int.Parse(buildingIdStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to get info for building id NaN");
- return;
- }
- if (Ranch.RanchBuilding.RanchBuildingExists(buildingId))
- {
- Ranch.RanchBuilding building = Ranch.RanchBuilding.GetRanchBuildingById(buildingId);
- int ranchBuild = sender.LoggedinUser.LastClickedRanchBuilding;
- if (ranchBuild == 0)
- return;
- if (sender.LoggedinUser.OwnedRanch != null)
- {
- if (ranchBuild > sender.LoggedinUser.OwnedRanch.GetRanchUpgrade().Limit)
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to build more buildings than the limit.");
- return;
- }
-
- if (sender.LoggedinUser.Money >= building.Cost)
- {
- sender.LoggedinUser.OwnedRanch.SetBuilding(ranchBuild - 1, building);
- sender.LoggedinUser.OwnedRanch.InvestedMoney += building.Cost;
- sender.LoggedinUser.TakeMoney(building.Cost);
- byte[] chatPacket = PacketBuilder.CreateChat(Messages.RanchBuildingComplete, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatPacket);
- UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y, true);
- return;
-
- }
- else
- {
- byte[] chatPacket = PacketBuilder.CreateChat(Messages.RanchCantAffordThisBuilding, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatPacket);
- return;
- }
- }
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to build in a ranch when they dont own one.");
- return;
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to get info for building id that didnt exist.");
- return;
- }
- }
- else if (method == PacketBuilder.RANCH_BUY)
- {
- string nan = packetStr.Substring(2, packetStr.Length - 4);
- if (nan == "NaN")
- {
- if (Ranch.IsRanchHere(sender.LoggedinUser.X, sender.LoggedinUser.Y))
- {
- Ranch ranch = Ranch.GetRanchAt(sender.LoggedinUser.X, sender.LoggedinUser.Y);
- if (sender.LoggedinUser.Money >= ranch.Value)
- {
- byte[] broughtRanch = PacketBuilder.CreateChat(Messages.FormatRanchBroughtMessage(ranch.Value), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(broughtRanch);
- sender.LoggedinUser.TakeMoney(ranch.Value);
- ranch.OwnerId = sender.LoggedinUser.Id;
- ranch.InvestedMoney += ranch.Value;
- sender.LoggedinUser.OwnedRanch = ranch;
- sender.LoggedinUser.Inventory.AddIgnoringFull(new ItemInstance(Item.DorothyShoes));
- UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y, true);
-
- }
- else
- {
- byte[] cantAfford = PacketBuilder.CreateChat(Messages.RanchCantAffordRanch, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantAfford);
- }
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to buy a non existant ranch.");
- return;
- }
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent RANCH_BUY without \"NaN\".");
- return;
- }
- }
- else if (method == PacketBuilder.RANCH_CLICK)
- {
- if (packet.Length < 6)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid ranch click packet.");
- return;
- }
- byte action = packet[2];
- if (action == PacketBuilder.RANCH_CLICK_BUILD)
- {
- if (Ranch.IsRanchHere(sender.LoggedinUser.X, sender.LoggedinUser.Y))
- {
- Ranch ranch = Ranch.GetRanchAt(sender.LoggedinUser.X, sender.LoggedinUser.Y);
- if (sender.LoggedinUser.OwnedRanch != null)
- {
- if (sender.LoggedinUser.OwnedRanch.Id == ranch.Id)
- {
- int buildSlot = packet[3] - 40;
- sender.LoggedinUser.LastClickedRanchBuilding = buildSlot;
- sender.LoggedinUser.MajorPriority = true;
-
- if (buildSlot == 0)
- {
- byte[] buildingsAvalible = PacketBuilder.CreateMetaPacket(Meta.BuildRanchUpgrade(ranch));
- sender.SendPacket(buildingsAvalible);
-
- }
- else
- {
- byte[] buildingsAvalible = PacketBuilder.CreateMetaPacket(Meta.BuildRanchBuildingsAvalible(ranch, buildSlot));
- sender.SendPacket(buildingsAvalible);
- }
-
-
- return;
- }
- }
- }
-
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to build in a ranch they didnt own.");
- return;
- }
- else if (action == PacketBuilder.RANCH_CLICK_NORM)
- {
- if (Ranch.IsRanchHere(sender.LoggedinUser.X, sender.LoggedinUser.Y))
- {
- Ranch ranch = Ranch.GetRanchAt(sender.LoggedinUser.X, sender.LoggedinUser.Y);
- int buildSlot = packet[3] - 40;
- sender.LoggedinUser.MajorPriority = true;
-
- if (buildSlot == 0) // Main Building
- {
- byte[] upgradeDescription = PacketBuilder.CreateMetaPacket(Meta.BuildRanchBuilding(ranch, ranch.GetRanchUpgrade()));
- sender.SendPacket(upgradeDescription);
- }
- else // Other Building
- {
- byte[] buildingDescription = PacketBuilder.CreateMetaPacket(Meta.BuildRanchBuilding(ranch, ranch.GetBuilding(buildSlot - 1)));
- sender.SendPacket(buildingDescription);
- }
- return;
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " sent an Unknown ranch packet " + BitConverter.ToString(packet).Replace("-", " "));
- }
- }
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " sent an Unknown ranch packet " + BitConverter.ToString(packet).Replace("-", " "));
- }
- }
- public static void OnChatPacket(GameClient sender, byte[] packet)
- {
- if (!sender.LoggedIn)
- {
- Logger.ErrorPrint(sender.RemoteIp + " Sent chat packet when not logged in.");
- return;
- }
-
- if (packet.Length < 4)
- {
- Logger.ErrorPrint(sender.RemoteIp + " Sent an invalid chat packet.");
- return;
- }
-
-
- string packetStr = Encoding.UTF8.GetString(packet);
-
- Chat.ChatChannel channel = (Chat.ChatChannel)packet[1];
- string message = packetStr.Substring(2, packetStr.Length - 4);
-
- Logger.DebugPrint(sender.LoggedinUser.Username + " Attempting to say '" + message + "' in channel: " + channel.ToString());
-
- string nameTo = null;
- if (channel == Chat.ChatChannel.Dm)
- {
- nameTo = Chat.GetDmRecipiant(message);
- message = Chat.GetDmMessage(message);
- }
-
- if (message == "")
- return;
-
- if (message.StartsWith("/"))
- {
- string channelString = message.Split(' ')[0].ToLower();
- string newMessage = string.Join(' ', message.Split(' ').Skip(1));
- message = newMessage.Trim();
-
- if (message == "")
- channelString = "/";
-
- switch (channelString)
- {
- case "/$":
- case "/ads":
- channel = Chat.ChatChannel.Ads;
- break;
- case "/a":
- case "/all":
- channel = Chat.ChatChannel.All;
- break;
- case "/h":
- case "/here":
- channel = Chat.ChatChannel.Here;
- break;
- case "/n":
- case "/near":
- channel = Chat.ChatChannel.Near;
- break;
- case "/b":
- case "/buddy":
- channel = Chat.ChatChannel.Buddies;
- break;
- case "/i":
- case "/island":
- channel = Chat.ChatChannel.Isle;
- break;
- case "/admin":
- if (sender.LoggedinUser.Administrator)
- channel = Chat.ChatChannel.Admin;
- else
- return;
- break;
- case "/mod":
- if (sender.LoggedinUser.Moderator)
- channel = Chat.ChatChannel.Mod;
- else
- return;
- break;
- default:
- channel = Chat.ChatChannel.Dm;
- nameTo = channelString.Substring(1).Trim();
- break;
- }
-
- if (message == "") // this is how pinto does it, im serious.
- {
- channel = Chat.ChatChannel.Dm;
- nameTo = "";
- }
- }
-
- message = message.Trim();
-
- if (channel == Chat.ChatChannel.All && message.Length > 150)
- {
- byte[] tooLong = PacketBuilder.CreateChat(Messages.GlobalChatTooLong, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(tooLong);
- return;
- }
-
- if (channel == Chat.ChatChannel.Ads && message.Length > 150)
- {
- byte[] tooLong = PacketBuilder.CreateChat(Messages.AdsChatTooLong, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(tooLong);
- return;
- }
- if (Chat.ProcessCommand(sender.LoggedinUser, message))
- {
- Logger.DebugPrint(sender.LoggedinUser.Username + " Attempting to run command '" + message + "' in channel: " + channel.ToString());
- return;
- }
-
- // Check events
- if (RiddleEvent.Active)
- if(RiddleEvent.CheckRiddle(message))
- RiddleEvent.Win(sender.LoggedinUser);
-
-
-
- // Check if player is muting channel
-
- if( (sender.LoggedinUser.MuteGlobal && channel == Chat.ChatChannel.All) || (sender.LoggedinUser.MuteAds && channel == Chat.ChatChannel.Ads) || (sender.LoggedinUser.MuteHere && channel == Chat.ChatChannel.Here) && (sender.LoggedinUser.MuteBuddy && channel == Chat.ChatChannel.Buddies) && (sender.LoggedinUser.MuteNear && channel == Chat.ChatChannel.Near) && (sender.LoggedinUser.MuteIsland && channel == Chat.ChatChannel.Isle))
- {
- byte[] cantSendMessage = PacketBuilder.CreateChat(Messages.CantSendInMutedChannel, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantSendMessage);
- return;
- }
-
- if(sender.LoggedinUser.MutePrivateMessage && channel == Chat.ChatChannel.Dm)
- {
- byte[] cantSendDmMessage = PacketBuilder.CreateChat(Messages.CantSendPrivateMessageWhileMuted, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantSendDmMessage);
- return;
- }
-
- Object violationReason = Chat.FilterMessage(message);
- if (violationReason != null)
- {
- sender.LoggedinUser.ChatViolations += 1;
- string chatViolationMessage = Messages.FormatGlobalChatViolationMessage((Chat.Reason)violationReason);
- byte[] chatViolationPacket = PacketBuilder.CreateChat(chatViolationMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatViolationPacket);
- return;
- }
-
- byte chatSide = Chat.GetSide(channel);
- message = Chat.DoCorrections(message);
- message = Chat.EscapeMessage(message);
-
- string failedReason = Chat.NonViolationChecks(sender.LoggedinUser, message);
- if (failedReason != null)
- {
- byte[] failedMessage = PacketBuilder.CreateChat(failedReason, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(failedMessage);
- return;
- }
-
- GameClient[] recipiants = Chat.GetRecipiants(sender.LoggedinUser, channel, nameTo);
-
-
- if(channel == Chat.ChatChannel.Dm)
- {
- if(recipiants.Length <= 0)
- {
- byte[] cantFindPlayer = PacketBuilder.CreateChat(Messages.CantFindPlayerToPrivateMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantFindPlayer);
-
- return;
- }
- else
- {
- nameTo = recipiants[0].LoggedinUser.Username;
- }
- }
-
- // Spam filter
- if(ConfigReader.EnableSpamFilter)
- {
- if (channel == Chat.ChatChannel.Ads)
- {
- if (!sender.LoggedinUser.CanUseAdsChat && !sender.LoggedinUser.Administrator)
- {
- byte[] cantSendInAds = PacketBuilder.CreateChat(Messages.AdsOnlyOncePerMinute, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantSendInAds);
-
- return;
- }
- sender.LoggedinUser.CanUseAdsChat = false;
- }
- else if (channel == Chat.ChatChannel.All)
- {
- if (sender.LoggedinUser.TotalGlobalChatMessages <= 0 && !sender.LoggedinUser.Administrator)
- {
- byte[] globalLimited = PacketBuilder.CreateChat(Messages.GlobalChatLimited, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(globalLimited);
-
- return;
- }
- sender.LoggedinUser.TotalGlobalChatMessages--;
- }
- }
-
-
- // Muted user checks
- if(channel == Chat.ChatChannel.Dm)
- {
- try
- {
- User userTo = GetUserByNameStartswith(nameTo);
- if (sender.LoggedinUser.MutePlayer.IsUserMuted(userTo))
- {
- byte[] dmWasBlocked = PacketBuilder.CreateChat(Messages.FormatCantSendYourIgnoringPlayer(userTo.Username), PacketBuilder.CHAT_DM_RIGHT);
- sender.SendPacket(dmWasBlocked);
- return;
- }
- else if (userTo.MutePrivateMessage)
- {
- byte[] dmWasBlocked = PacketBuilder.CreateChat(Messages.FormatPlayerIgnoringAllPms(userTo.Username), PacketBuilder.CHAT_DM_RIGHT);
- sender.SendPacket(dmWasBlocked);
- return;
- }
- else if (userTo.MutePlayer.IsUserMuted(sender.LoggedinUser))
- {
- byte[] dmWasBlocked = PacketBuilder.CreateChat(Messages.FormatPlayerIgnoringYourPms(userTo.Username), PacketBuilder.CHAT_DM_RIGHT);
- sender.SendPacket(dmWasBlocked);
- return;
- }
- }
- catch (KeyNotFoundException)
- {
- return;
- }
- }
- // Finally send chat message.
- string formattedMessage = Chat.FormatChatForOthers(sender.LoggedinUser, channel, message);
- string formattedMessageSender = Chat.FormatChatForSender(sender.LoggedinUser, channel, message, nameTo);
-
-
- byte[] chatPacketOthers = PacketBuilder.CreateChat(formattedMessage, chatSide);
- byte[] chatPacketSender = PacketBuilder.CreateChat(formattedMessageSender, chatSide);
- byte[] playDmSound = PacketBuilder.CreatePlaysoundPacket(Chat.PrivateMessageSound);
-
- // Send to clients ...
- foreach (GameClient recipiant in recipiants)
- {
- recipiant.SendPacket(chatPacketOthers);
-
- if (channel == Chat.ChatChannel.Dm)
- recipiant.SendPacket(playDmSound);
- }
-
- // Send to sender
- sender.SendPacket(chatPacketSender);
-
- // AutoReply
- if (channel == Chat.ChatChannel.Dm)
- {
- foreach (GameClient recipiant in recipiants)
- {
- if (recipiant.LoggedinUser.AutoReplyText != "")
- {
- string formattedMessageAuto = Chat.FormatChatForOthers(recipiant.LoggedinUser, channel, recipiant.LoggedinUser.AutoReplyText, true);
- string formattedMessageSenderAuto = Chat.FormatChatForSender(recipiant.LoggedinUser, channel, recipiant.LoggedinUser.AutoReplyText, nameTo, true);
-
- byte[] chatPacketAutoOthers = PacketBuilder.CreateChat(formattedMessageAuto, chatSide);
- sender.SendPacket(chatPacketAutoOthers);
-
- byte[] chatPacketAutoSender = PacketBuilder.CreateChat(formattedMessageSenderAuto, chatSide);
- recipiant.SendPacket(chatPacketAutoSender);
- }
- }
-
- }
-
- }
- 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 < 6)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid Click Packet");
- return;
- }
-
- string packetStr = Encoding.UTF8.GetString(packet);
- if(packetStr.Contains("|"))
- {
- string packetContents = packetStr.Substring(1, packetStr.Length - 3);
- string[] xy = packetContents.Split('|');
- int x = 0;
- int y = 0;
-
- try
- {
- x = int.Parse(xy[0])+4;
- y = int.Parse(xy[1])+1;
- }
- catch(FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent a click packet with non-string xy value.");
- return;
- }
-
- Logger.DebugPrint(sender.LoggedinUser.Username + " Clicked on tile: " + Map.GetTileId(x, y, false).ToString() + "(overlay: " + Map.GetTileId(x, y, true).ToString() + ") at " + x.ToString() + "," + y.ToString());
-
-
- // 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;
- }
- if(Ranch.IsRanchHere(x, y)) // Ranch here?
- {
- Ranch ranch = Ranch.GetRanchAt(x, y);
- if(ranch.OwnerId == -1)
- {
- returnedMsg = Messages.RanchUnownedRanchClicked;
- }
- else
- {
- string title = ranch.Title;
- if (title == null || title == "")
- title = Messages.RanchDefaultRanchTitle;
- returnedMsg = Messages.FormatRanchClickMessage(Database.GetUsername(ranch.OwnerId), title);
- }
- }
- User[] users = GetUsersAt(x, y, false, true);
- if (users.Length > 0) // Player here?
- {
- string usernameStr = "";
-
- for(int i = 0; i < users.Length; i++)
- {
- usernameStr += users[i].Username;
- if (i + 1 < users.Length)
- usernameStr += ", ";
- }
-
- returnedMsg = Messages.FormatPlayerHereMessage(usernameStr);
- }
-
- byte[] tileInfoPacket = PacketBuilder.CreateClickTileInfoPacket(returnedMsg);
- sender.SendPacket(tileInfoPacket);
- }
- }
- public static void OnItemInteraction(GameClient sender, byte[] packet)
- {
- if (!sender.LoggedIn)
- {
- Logger.ErrorPrint(sender.RemoteIp + " Sent object interaction packet when not logged in.");
- return;
- }
- if (packet.Length < 3)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet. " + BitConverter.ToString(packet));
- return;
- }
-
- byte action = packet[1];
- switch(action)
- {
- case PacketBuilder.ITEM_PICKUP_ALL:
- string chatMsg = Messages.GrabAllItemsMessage;
- DroppedItems.DroppedItem[] droppedItems = DroppedItems.GetItemsAt(sender.LoggedinUser.X, sender.LoggedinUser.Y);
-
- foreach (DroppedItems.DroppedItem item in droppedItems)
- {
- try
- {
- sender.LoggedinUser.Inventory.Add(item.Instance);
- DroppedItems.RemoveDroppedItem(item);
- }
- catch (InventoryException)
- {
- chatMsg = Messages.GrabbedAllItemsButInventoryFull;
- }
- }
-
- UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y);
-
- byte[] chatMessage = PacketBuilder.CreateChat(chatMsg, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatMessage);
-
- break;
- case PacketBuilder.ITEM_PICKUP:
- string packetStr = Encoding.UTF8.GetString(packet);
- string randomIdStr = packetStr.Substring(2, packet.Length - 4);
- int randomId = 0;
-
- try
- {
- randomId = Int32.Parse(randomIdStr);
- }
- catch(FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet. " + BitConverter.ToString(packet));
- return;
- }
-
- try
- {
- DroppedItems.DroppedItem item = DroppedItems.GetDroppedItemById(randomId);
- try
- {
- sender.LoggedinUser.Inventory.Add(item.Instance);
- }
- catch (InventoryException)
- {
- byte[] inventoryFullMessage = PacketBuilder.CreateChat(Messages.GrabbedItemButInventoryFull, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(inventoryFullMessage);
- break;
- }
-
-
- DroppedItems.RemoveDroppedItem(item);
-
- UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y);
-
- chatMessage = PacketBuilder.CreateChat(Messages.GrabbedItemMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatMessage);
- }
- catch(KeyNotFoundException)
- {
- byte[] pickedUp = PacketBuilder.CreateChat(Messages.DroppedItemCouldntPickup, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(pickedUp);
-
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to grab a non existing object.");
- return;
- }
-
- break;
- case PacketBuilder.ITEM_REMOVE:
- char toRemove = (char)packet[2];
- switch(toRemove)
- {
- case '1':
- if(sender.LoggedinUser.EquipedCompetitionGear.Head != null)
- {
- ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedCompetitionGear.Head.Id);
- sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance);
- sender.LoggedinUser.EquipedCompetitionGear.Head = null;
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Attempted to remove competition gear when none was equipped.");
- }
- break;
- case '2':
- if (sender.LoggedinUser.EquipedCompetitionGear.Body != null)
- {
- ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedCompetitionGear.Body.Id);
- sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance);
- sender.LoggedinUser.EquipedCompetitionGear.Body = null;
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Attempted to remove competition gear when none was equipped.");
- }
- break;
- case '3':
- if (sender.LoggedinUser.EquipedCompetitionGear.Legs != null)
- {
- ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedCompetitionGear.Legs.Id);
- sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance);
- sender.LoggedinUser.EquipedCompetitionGear.Legs = null;
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Attempted to remove competition gear when none was equipped.");
- }
- break;
- case '4':
- if (sender.LoggedinUser.EquipedCompetitionGear.Feet != null)
- {
- ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedCompetitionGear.Feet.Id);
- sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance);
- sender.LoggedinUser.EquipedCompetitionGear.Feet = null;
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Attempted to remove competition gear when none was equipped.");
- }
- break;
- case '5':
- if (sender.LoggedinUser.EquipedJewelry.Slot1 != null)
- {
- ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedJewelry.Slot1.Id);
- sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance);
- sender.LoggedinUser.EquipedJewelry.Slot1 = null;
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Attempted to remove jewery when none was equipped.");
- }
- break;
- case '6':
- if (sender.LoggedinUser.EquipedJewelry.Slot2 != null)
- {
- ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedJewelry.Slot2.Id);
- sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance);
- sender.LoggedinUser.EquipedJewelry.Slot2 = null;
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Attempted to remove jewery when none was equipped.");
- }
- break;
- case '7':
- if (sender.LoggedinUser.EquipedJewelry.Slot3 != null)
- {
- ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedJewelry.Slot3.Id);
- sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance);
- sender.LoggedinUser.EquipedJewelry.Slot3 = null;
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Attempted to remove jewery when none was equipped.");
- }
- break;
- case '8':
- if (sender.LoggedinUser.EquipedJewelry.Slot4 != null)
- {
- ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedJewelry.Slot4.Id);
- sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance);
- sender.LoggedinUser.EquipedJewelry.Slot4 = null;
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Attempted to remove jewery when none was equipped.");
- }
- break;
- default:
- Logger.InfoPrint(sender.LoggedinUser.Username + "Unimplemented \"remove worn item\" ItemInteraction packet: " + BitConverter.ToString(packet).Replace("-", " "));
- break;
- }
-
- UpdateStats(sender);
- if(toRemove >= '1' && toRemove <= '4')
- {
- byte[] itemRemovedMessage = PacketBuilder.CreateChat(Messages.RemoveCompetitionGear, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(itemRemovedMessage);
- }
- else if (toRemove >= '5' && toRemove <= '8')
- {
- byte[] itemRemovedMessage = PacketBuilder.CreateChat(Messages.RemoveJewelry, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(itemRemovedMessage);
- }
-
- break;
- case PacketBuilder.ITEM_THROW:
- packetStr = Encoding.UTF8.GetString(packet);
- string itemidStr = packetStr.Substring(2, packet.Length - 2);
- int itemId = 0;
-
- try
- {
- itemId = Int32.Parse(itemidStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet. (THROW) " + BitConverter.ToString(packet));
- return;
- }
- if (sender.LoggedinUser.Inventory.HasItemId(itemId))
- {
- if (!Item.IsThrowable(itemId))
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to throw an item that isnt throwable.");
- return;
- }
-
- ItemInstance curItem = sender.LoggedinUser.Inventory.GetItemByItemId(itemId).ItemInstances[0];
- User[] userAt = GetReallyNearbyUsers(sender.LoggedinUser.X, sender.LoggedinUser.Y);
-
- while (true)
- {
- int userIndx = RandomNumberGenerator.Next(0, userAt.Length);
-
- if (userAt.Length > 1)
- if (userAt[userIndx].Id == sender.LoggedinUser.Id)
- continue;
-
- Item.ThrowableItem throwableItem = Item.GetThrowableItem(curItem.ItemId);
-
- if (userAt[userIndx].Id == sender.LoggedinUser.Id)
- {
- byte[] thrownHitYourself = PacketBuilder.CreateChat(throwableItem.HitYourselfMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(thrownHitYourself);
- break;
- }
- if(itemId == Item.WaterBalloon)
- {
- if (WaterBalloonEvent != null)
- if (WaterBalloonEvent.Active)
- WaterBalloonEvent.AddWaterBallon(userAt[userIndx]);
- }
- if(itemId == Item.ModSplatterball)
- {
- ModsRevengeEvent.Payout(sender.LoggedinUser, userAt[userIndx]);
- }
-
- byte[] thrownForYou = PacketBuilder.CreateChat(Messages.FormatThrownItemMessage(throwableItem.ThrowMessage, userAt[userIndx].Username), PacketBuilder.CHAT_BOTTOM_RIGHT);
- byte[] thrownForOthers = PacketBuilder.CreateChat(Messages.FormatThrownItemMessage(throwableItem.HitMessage, sender.LoggedinUser.Username), PacketBuilder.CHAT_BOTTOM_RIGHT);
-
- sender.SendPacket(thrownForYou);
- userAt[userIndx].LoggedinClient.SendPacket(thrownForOthers);
-
- break;
- }
-
- sender.LoggedinUser.Inventory.Remove(curItem);
- UpdateInventory(sender);
-
- }
- break;
- case PacketBuilder.ITEM_WRAP:
- packetStr = Encoding.UTF8.GetString(packet);
- randomIdStr = packetStr.Substring(2, packet.Length - 2);
- randomId = 0;
-
- try
- {
- randomId = Int32.Parse(randomIdStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet. " + BitConverter.ToString(packet));
- return;
- }
- if (sender.LoggedinUser.Inventory.HasItem(randomId))
- {
- ItemInstance curItem = sender.LoggedinUser.Inventory.GetItemByRandomid(randomId).ItemInstances[0];
- ItemInstance wrappedItem = new ItemInstance(Item.Present, -1, curItem.ItemId);
-
- try
- {
- sender.LoggedinUser.Inventory.Add(wrappedItem);
- sender.LoggedinUser.Inventory.Remove(curItem);
- }
- catch(InventoryException)
- {
- byte[] cantWrapPresent = PacketBuilder.CreateChat(Messages.SantaCantWrapInvFull, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantWrapPresent);
- UpdateArea(sender);
- break;
- }
- }
- byte[] wrappedObjectMessage = PacketBuilder.CreateChat(Messages.SantaWrappedObjectMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(wrappedObjectMessage);
- UpdateArea(sender);
- break;
- case PacketBuilder.ITEM_OPEN:
- packetStr = Encoding.UTF8.GetString(packet);
- randomIdStr = packetStr.Substring(2, packet.Length - 2);
- randomId = 0;
-
- try
- {
- randomId = Int32.Parse(randomIdStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet. " + BitConverter.ToString(packet));
- return;
- }
- if (sender.LoggedinUser.Inventory.HasItem(randomId))
- {
- InventoryItem item = sender.LoggedinUser.Inventory.GetItemByRandomid(randomId);
- int newItem = item.ItemInstances[0].Data;
- if(newItem == 0)
- {
- sender.LoggedinUser.Inventory.Remove(item.ItemInstances[0]);
-
- byte[] itemOpenFailedNothingInside = PacketBuilder.CreateChat(Messages.SantaCantOpenNothingInside, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(itemOpenFailedNothingInside);
-
- UpdateInventory(sender);
-
- break;
- }
-
- try
- {
- sender.LoggedinUser.Inventory.Add(new ItemInstance(newItem));
- sender.LoggedinUser.Inventory.Remove(item.ItemInstances[0]);
- }
- catch(InventoryException)
- {
- byte[] cantOpenInvFull = PacketBuilder.CreateChat(Messages.SantaItemCantOpenInvFull, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantOpenInvFull);
- break;
- }
- byte[] itemOpened = PacketBuilder.CreateChat(Messages.FormatSantaOpenPresent(Item.GetItemById(newItem).Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(itemOpened);
- UpdateInventory(sender);
- }
- break;
- case PacketBuilder.ITEM_USE:
- packetStr = Encoding.UTF8.GetString(packet);
- randomIdStr = packetStr.Substring(2, packet.Length - 4);
-
- if(randomIdStr == "") // f12 ranch shortcut
- {
- if (sender.LoggedinUser.Inventory.HasItemId(Item.DorothyShoes))
- {
- InventoryItem itm = sender.LoggedinUser.Inventory.GetItemByItemId(Item.DorothyShoes);
- Item.UseItem(sender.LoggedinUser, itm.ItemInstances[0]);
- return;
- }
- else
- {
- byte[] noShoesMessage = PacketBuilder.CreateChat(Messages.RanchNoDorothyShoesMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(noShoesMessage);
- return;
- }
- }
-
- randomId = 0;
-
- try
- {
- randomId = Int32.Parse(randomIdStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet. " + BitConverter.ToString(packet));
- return;
- }
- if (sender.LoggedinUser.Inventory.HasItem(randomId))
- {
- InventoryItem itm = sender.LoggedinUser.Inventory.GetItemByRandomid(randomId);
- Item.UseItem(sender.LoggedinUser, itm.ItemInstances[0]);
- }
- break;
- case PacketBuilder.ITEM_WEAR:
- packetStr = Encoding.UTF8.GetString(packet);
- randomIdStr = packetStr.Substring(2, packet.Length - 2);
- randomId = 0;
-
- try
- {
- randomId = Int32.Parse(randomIdStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet. " + BitConverter.ToString(packet));
- return;
- }
- if (sender.LoggedinUser.Inventory.HasItem(randomId))
- {
- InventoryItem itm = sender.LoggedinUser.Inventory.GetItemByRandomid(randomId);
- ItemInstance instance = itm.ItemInstances[0];
-
- Item.ItemInformation itemInf = instance.GetItemInfo();
- if(itemInf.Type == "CLOTHES")
- {
- switch (itemInf.GetMiscFlag(0))
- {
- case CompetitionGear.MISC_FLAG_HEAD:
- if (sender.LoggedinUser.EquipedCompetitionGear.Head == null)
- sender.LoggedinUser.EquipedCompetitionGear.Head = itemInf;
- else
- {
- ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedCompetitionGear.Head.Id);
- sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance);
- sender.LoggedinUser.EquipedCompetitionGear.Head = itemInf;
- }
- break;
- case CompetitionGear.MISC_FLAG_BODY:
- if (sender.LoggedinUser.EquipedCompetitionGear.Body == null)
- sender.LoggedinUser.EquipedCompetitionGear.Body = itemInf;
- else
- {
- ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedCompetitionGear.Body.Id);
- sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance);
- sender.LoggedinUser.EquipedCompetitionGear.Body = itemInf;
- }
- break;
- case CompetitionGear.MISC_FLAG_LEGS:
- if (sender.LoggedinUser.EquipedCompetitionGear.Legs == null)
- sender.LoggedinUser.EquipedCompetitionGear.Legs = itemInf;
- else
- {
- ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedCompetitionGear.Legs.Id);
- sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance);
- sender.LoggedinUser.EquipedCompetitionGear.Legs = itemInf;
- }
- break;
- case CompetitionGear.MISC_FLAG_FEET:
- if (sender.LoggedinUser.EquipedCompetitionGear.Feet == null)
- sender.LoggedinUser.EquipedCompetitionGear.Feet = itemInf;
- else
- {
- ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedCompetitionGear.Feet.Id);
- sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance);
- sender.LoggedinUser.EquipedCompetitionGear.Feet = itemInf;
- }
- break;
- default:
- Logger.ErrorPrint(itemInf.Name + " Has unknown misc flags.");
- return;
- }
- sender.LoggedinUser.Inventory.Remove(instance);
- byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatEquipCompetitionGearMessage(itemInf.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatPacket);
- }
- else if(itemInf.Type == "JEWELRY")
- {
- bool addedJewelry = false;
- if (sender.LoggedinUser.EquipedJewelry.Slot1 == null)
- {
- sender.LoggedinUser.EquipedJewelry.Slot1 = itemInf;
- addedJewelry = true;
- }
- else if (sender.LoggedinUser.EquipedJewelry.Slot2 == null)
- {
- sender.LoggedinUser.EquipedJewelry.Slot2 = itemInf;
- addedJewelry = true;
- }
- else if (sender.LoggedinUser.EquipedJewelry.Slot3 == null)
- {
- sender.LoggedinUser.EquipedJewelry.Slot3 = itemInf;
- addedJewelry = true;
- }
- else if (sender.LoggedinUser.EquipedJewelry.Slot4 == null)
- {
- sender.LoggedinUser.EquipedJewelry.Slot4 = itemInf;
- addedJewelry = true;
- }
-
- if(addedJewelry)
- {
- sender.LoggedinUser.Inventory.Remove(instance);
- byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatJewerlyEquipMessage(itemInf.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatPacket);
- }
- else
- {
- byte[] chatPacket = PacketBuilder.CreateChat(Messages.MaxJewelryMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatPacket);
- }
- }
-
- UpdateInventory(sender);
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to wear an item they did not have.");
- }
- break;
- case PacketBuilder.ITEM_DRINK:
- packetStr = Encoding.UTF8.GetString(packet);
- string idStr = packetStr.Substring(2, packet.Length - 4);
- if(idStr == "NaN") // Fountain
- {
- string msg = Messages.FountainDrankYourFull;
- bool looseMoney = RandomNumberGenerator.Next(0, 20) == 18;
- if(looseMoney)
- {
- int looseAmount = RandomNumberGenerator.Next(0, 100);
- if (looseAmount > sender.LoggedinUser.Money)
- looseAmount = sender.LoggedinUser.Money;
- sender.LoggedinUser.TakeMoney(looseAmount);
- msg = Messages.FormatDroppedMoneyMessage(looseAmount);
- }
-
- sender.LoggedinUser.Thirst = 1000;
- byte[] drankFromFountainMessage = PacketBuilder.CreateChat(msg, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(drankFromFountainMessage);
- }
- else
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + "Sent unknown ITEM_DRINK command id: " + idStr);
- }
- break;
- case PacketBuilder.ITEM_CONSUME:
- packetStr = Encoding.UTF8.GetString(packet);
- randomIdStr = packetStr.Substring(2, packet.Length - 3);
- randomId = 0;
-
- try
- {
- randomId = Int32.Parse(randomIdStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet. " + BitConverter.ToString(packet));
- return;
- }
-
- if (sender.LoggedinUser.Inventory.HasItem(randomId))
- {
- InventoryItem itm = sender.LoggedinUser.Inventory.GetItemByRandomid(randomId);
- ItemInstance instance = itm.ItemInstances[0];
- sender.LoggedinUser.Inventory.Remove(instance);
- Item.ItemInformation itmInfo = instance.GetItemInfo();
- bool toMuch = Item.ConsumeItem(sender.LoggedinUser, itmInfo);
-
- byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatConsumeItemMessaege(itmInfo.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatPacket);
- if (toMuch)
- {
- chatPacket = PacketBuilder.CreateChat(Messages.ConsumedButMaxReached, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatPacket);
- }
-
- UpdateInventory(sender);
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to consume an item they did not have.");
- }
- break;
- case PacketBuilder.ITEM_DROP:
- packetStr = Encoding.UTF8.GetString(packet);
- randomIdStr = packetStr.Substring(2, packet.Length - 2);
- randomId = 0;
-
- try
- {
- randomId = Int32.Parse(randomIdStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet. (drop)"+BitConverter.ToString(packet));
- return;
- }
-
- if(sender.LoggedinUser.Inventory.HasItem(randomId))
- {
- InventoryItem itm = sender.LoggedinUser.Inventory.GetItemByRandomid(randomId);
- ItemInstance instance = itm.ItemInstances[0];
- if(DroppedItems.GetItemsAt(sender.LoggedinUser.X, sender.LoggedinUser.Y).Length > 25)
- {
- byte[] tileIsFullPacket = PacketBuilder.CreateChat(Messages.DroppedItemTileIsFull, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(tileIsFullPacket);
- break;
- }
- DroppedItems.AddItem(instance, sender.LoggedinUser.X, sender.LoggedinUser.Y);
- sender.LoggedinUser.Inventory.Remove(instance);
- byte[] chatPacket = PacketBuilder.CreateChat(Messages.DroppedAnItemMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(chatPacket);
- UpdateInventory(sender);
-
- UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y, false, sender.LoggedinUser);
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to drop an item they did not have.");
- }
- break;
- case PacketBuilder.ITEM_SHOVEL:
- if (packet[2] != 0x14)
- Logger.HackerPrint(sender.LoggedinUser.Username + " Used ITEM_SHOVEL with 3rd byte not 0x14.");
- if (!Quest.UseTool(sender.LoggedinUser, Quest.Shovel, sender.LoggedinUser.X, sender.LoggedinUser.Y))
- {
- byte[] ChatPacket = PacketBuilder.CreateChat(Messages.ShovelNothing, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(ChatPacket);
- }
- break;
- case PacketBuilder.ITEM_RAKE:
- if (packet[2] != 0x14)
- Logger.HackerPrint(sender.LoggedinUser.Username + " Used ITEM_RAKE with 3rd byte not 0x14.");
- if (!Quest.UseTool(sender.LoggedinUser, Quest.Rake, sender.LoggedinUser.X, sender.LoggedinUser.Y))
- {
- byte[] ChatPacket = PacketBuilder.CreateChat(Messages.RakeNothing, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(ChatPacket);
- }
- break;
- case PacketBuilder.ITEM_MAGNIFYING:
- if (packet[2] != 0x14)
- Logger.HackerPrint(sender.LoggedinUser.Username + " Used ITEM_MAGNIFYING with 3rd byte not 0x14.");
- if (!Quest.UseTool(sender.LoggedinUser, Quest.MagnifyingGlass, sender.LoggedinUser.X, sender.LoggedinUser.Y))
- {
- byte[] ChatPacket = PacketBuilder.CreateChat(Messages.MagnifyNothing, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(ChatPacket);
- }
- break;
- case PacketBuilder.ITEM_BINOCULARS:
- if (packet[2] != 0x14)
- Logger.HackerPrint(sender.LoggedinUser.Username + " Used ITEM_BINOCULARS with 3rd byte not 0x14.");
- if(!Quest.UseTool(sender.LoggedinUser, Quest.Binoculars, sender.LoggedinUser.X, sender.LoggedinUser.Y))
- {
- byte[] ChatPacket = PacketBuilder.CreateChat(Messages.BinocularsNothing, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(ChatPacket);
- }
- break;
- case PacketBuilder.ITEM_CRAFT:
- packetStr = Encoding.UTF8.GetString(packet);
- string craftIdStr = packetStr.Substring(2, packet.Length - 2);
- int craftId = 0;
- // Prevent crashing on non-int string.
- try
- {
- craftId = Int32.Parse(craftIdStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to craft using craft id NaN.");
- return;
- }
- if(Workshop.CraftIdExists(craftId))
- {
- Workshop.CraftableItem itm = Workshop.GetCraftId(craftId);
- if(itm.MoneyCost <= sender.LoggedinUser.Money) // Check money
- {
- foreach(Workshop.RequiredItem reqItem in itm.RequiredItems)
- {
- if (sender.LoggedinUser.Inventory.HasItemId(reqItem.RequiredItemId))
- {
- if (sender.LoggedinUser.Inventory.GetItemByItemId(reqItem.RequiredItemId).ItemInstances.Length < reqItem.RequiredItemCount)
- goto failMissingItem;
- }
- else
- goto failMissingItem;
- }
-
- // Finally create the items
- try
- {
- sender.LoggedinUser.Inventory.Add(new ItemInstance(itm.GiveItemId));
- }
- catch(InventoryException)
- {
- byte[] inventoryFullMessage = PacketBuilder.CreateChat(Messages.WorkshopNoRoomInInventory, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(inventoryFullMessage);
- break;
- }
- sender.LoggedinUser.TakeMoney(itm.MoneyCost);
-
- // Remove the required items..
- foreach(Workshop.RequiredItem reqItem in itm.RequiredItems)
- for(int i = 0; i < reqItem.RequiredItemCount; i++)
- sender.LoggedinUser.Inventory.Remove(sender.LoggedinUser.Inventory.GetItemByItemId(reqItem.RequiredItemId).ItemInstances[0]);
-
- sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.Crafting).Count++;
-
- if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.Crafting).Count >= 100)
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(22)); // Craftiness
- if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.Crafting).Count >= 1000)
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(23)); // Workmanship
-
- byte[] itemCraftSuccess = PacketBuilder.CreateChat(Messages.WorkshopCraftingSuccess, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(itemCraftSuccess);
- break;
-
- }
- else
- {
- byte[] cantAffordMessage = PacketBuilder.CreateChat(Messages.WorkshopCannotAfford, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantAffordMessage);
- break;
- }
-
- failMissingItem:
- {
- byte[] missingItemMessage = PacketBuilder.CreateChat(Messages.WorkshopMissingRequiredItem, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(missingItemMessage);
- break;
- }
- }
-
- break;
- case PacketBuilder.ITEM_SELL: // Handles selling an item.
- int totalSold = 1;
- int message = 1;
-
- packetStr = Encoding.UTF8.GetString(packet);
- randomIdStr = packetStr.Substring(2, packet.Length - 2);
- randomId = 0;
- // Prevent crashing on non-int string.
- try
- {
- randomId = Int32.Parse(randomIdStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object sell packet.");
- return;
- }
-
- if (!sender.LoggedinUser.Inventory.HasItem(randomId))
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to sell a item that they doesnt have in there inventory");
- return;
- }
-
- InventoryItem invItem = sender.LoggedinUser.Inventory.GetItemByRandomid(randomId);
- itemId = invItem.ItemId;
- goto doSell;
- case PacketBuilder.ITEM_SELL_ALL:
- packetStr = Encoding.UTF8.GetString(packet);
- string itemIdStr = packetStr.Substring(2, packet.Length - 2);
- itemId = 0;
- // Prevent crashing on non-int string.
- try
- {
- itemId = Int32.Parse(itemIdStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object sell packet.");
- return;
- }
-
- if (!sender.LoggedinUser.Inventory.HasItemId(itemId))
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to sell a item that they doesnt have in there inventory");
- return;
- }
- invItem = sender.LoggedinUser.Inventory.GetItemByItemId(itemId);
-
- totalSold = invItem.ItemInstances.Length;
- message = 2;
- goto doSell;
- doSell:;
-
- Item.ItemInformation itemInfo = Item.GetItemById(itemId);
- Shop shop = sender.LoggedinUser.LastShoppedAt;
- if (shop != null)
- {
- UInt64 sellPrice = Convert.ToUInt64(shop.CalculateSellCost(itemInfo) * Convert.ToUInt64(totalSold));
- if (shop.CanSell(itemInfo))
- {
- // Check if goes over 2.1b
- if (Convert.ToUInt64(sender.LoggedinUser.Money) + sellPrice > 2100000000)
- {
- byte[] cantSellMoneyCapCheck = PacketBuilder.CreateChat(Messages.CannotSellYoudGetTooMuchMoney, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantSellMoneyCapCheck);
- break;
- }
-
- // Remove items
- for (int i = 0; i < totalSold; i++)
- {
- ItemInstance itemInstance = invItem.ItemInstances[0];
- sender.LoggedinUser.Inventory.Remove(itemInstance);
- shop.Inventory.Add(itemInstance);
- }
-
- if (sellPrice < 2147483647) // Sanity Check (yes i checked it earlier)
- sender.LoggedinUser.AddMoney(Convert.ToInt32(sellPrice));
-
- UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y, true);
- if(message == 1)
- {
- byte[] soldItemMessage = PacketBuilder.CreateChat(Messages.FormatSellMessage(itemInfo.Name, sellPrice), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(soldItemMessage);
- }
- if(message == 2)
- {
- string name = itemInfo.Name;
-
- if (totalSold > 1)
- name = itemInfo.PluralName;
-
- byte[] soldItemMessage = PacketBuilder.CreateChat(Messages.FormatSellAllMessage(name, sellPrice, totalSold), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(soldItemMessage);
- }
-
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to sell a item that was not avalible to be sold.");
- }
- }
- break;
-
- case PacketBuilder.ITEM_BUY_AND_CONSUME:
- packetStr = Encoding.UTF8.GetString(packet);
- itemIdStr = packetStr.Substring(2, packet.Length - 3);
- itemId = 0;
- // Prevent crashing on non-int string.
- try
- {
- itemId = Int32.Parse(itemIdStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object buy and consume packet.");
- return;
- }
- if (!Item.ItemIdExist(itemId))
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to buy an itemid that doesnt even exist.");
- break;
- }
-
- Inn lastInn = sender.LoggedinUser.LastVisitedInn;
- if (lastInn != null)
- {
- try
- {
- itemInfo = lastInn.GetStockedItem(itemId);
- int price = lastInn.CalculateBuyCost(itemInfo);
- if(sender.LoggedinUser.Money >= price)
- {
- sender.LoggedinUser.TakeMoney(price);
- bool toMuch = Item.ConsumeItem(sender.LoggedinUser, itemInfo);
-
- string tooMuchMessage = Messages.ConsumedButMaxReached;
- if (itemInfo.Effects.Length > 0)
- if (itemInfo.Effects[0].EffectsWhat == "TIREDNESS")
- tooMuchMessage = Messages.InnFullyRested;
- if (itemInfo.Effects.Length > 1)
- if (itemInfo.Effects[1].EffectsWhat == "TIREDNESS")
- tooMuchMessage = Messages.InnFullyRested;
-
- byte[] enjoyedServiceMessage = PacketBuilder.CreateChat(Messages.FormatInnEnjoyedServiceMessage(itemInfo.Name, price), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(enjoyedServiceMessage);
-
- if(toMuch)
- {
- byte[] toMuchMessage = PacketBuilder.CreateChat(tooMuchMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(toMuchMessage);
- }
-
- UpdateArea(sender);
- }
- else
- {
- byte[] cantAffordMessage = PacketBuilder.CreateChat(Messages.InnCannotAffordService, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantAffordMessage);
- }
- }
- catch(KeyNotFoundException)
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to buy and consume an item not stocked by the inn there standing on.");
- }
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to buy and consume item while not in a inn.");
- }
- break;
-
- case PacketBuilder.ITEM_BUY: // Handles buying an item.
- message = 1;
- int count = 1;
- goto doPurchase;
- case PacketBuilder.ITEM_BUY_5:
- message = 2;
- count = 5;
- goto doPurchase;
- case PacketBuilder.ITEM_BUY_25:
- message = 3;
- count = 25;
- doPurchase:;
- packetStr = Encoding.UTF8.GetString(packet);
- itemIdStr = packetStr.Substring(2, packet.Length - 3);
- itemId = 0;
- // Prevent crashing on non-int string.
- try
- {
- itemId = Int32.Parse(itemIdStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object buy packet.");
- return;
- }
-
- if(!Item.ItemIdExist(itemId))
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to buy an itemid that doesnt even exist.");
- break;
- }
-
- itemInfo = Item.GetItemById(itemId);
- shop = sender.LoggedinUser.LastShoppedAt;
- if (shop != null)
- {
- UInt64 buyCost = Convert.ToUInt64(shop.CalculateBuyCost(itemInfo) * Convert.ToUInt64(count));
- if (sender.LoggedinUser.Bids.Length > 0)
- {
- byte[] cantBuyWhileAuctioning = PacketBuilder.CreateChat(Messages.AuctionNoOtherTransactionAllowed, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantBuyWhileAuctioning);
- return;
- }
-
- if (Convert.ToUInt64(sender.LoggedinUser.Money) < buyCost)
- {
- byte[] cantAffordMessage = PacketBuilder.CreateChat(Messages.CantAfford1, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(cantAffordMessage);
- return;
- }
- if (shop.Inventory.HasItemId(itemId))
- {
- if (shop.Inventory.GetItemByItemId(itemId).ItemInstances.Length < count)
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to buy more of an item than is in stock.");
- break;
- }
-
-
- // Check we wont overflow the inventory
- if (sender.LoggedinUser.Inventory.HasItemId(itemId))
- {
- InventoryItem items = sender.LoggedinUser.Inventory.GetItemByItemId(itemId);
- if (items.ItemInstances.Length + count > Item.MAX_STACK)
- {
- goto showError;
- }
-
- }
- else if(sender.LoggedinUser.Inventory.Count + 1 > sender.LoggedinUser.MaxItems)
- {
- goto showError;
- }
-
- for (int i = 0; i < count; i++)
- {
- ItemInstance itemInstance = shop.Inventory.GetItemByItemId(itemId).ItemInstances[0];
- try
- {
- sender.LoggedinUser.Inventory.Add(itemInstance);
- }
- catch (InventoryException)
- {
- Logger.ErrorPrint("Failed to add: " + itemInfo.Name + " to " + sender.LoggedinUser.Username + " inventory.");
- break;
- }
- shop.Inventory.Remove(itemInstance);
- }
-
- if(buyCost < 2147483647) // Sanity Check (yes i checked it earlier)
- sender.LoggedinUser.TakeMoney(Convert.ToInt32(buyCost));
-
-
- // Send chat message to client.
- UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y, true);
- if (message == 1)
- {
- byte[] broughtItemMessage = PacketBuilder.CreateChat(Messages.FormatBuyMessage(itemInfo.Name, buyCost), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(broughtItemMessage);
- }
- else if (message == 2)
- {
- byte[] broughtItemMessage = PacketBuilder.CreateChat(Messages.FormatBuy5Message(itemInfo.PluralName, buyCost), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(broughtItemMessage);
- }
- else if (message == 3)
- {
- byte[] broughtItemMessage = PacketBuilder.CreateChat(Messages.FormatBuy25Message(itemInfo.PluralName, buyCost), PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(broughtItemMessage);
- }
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to buy a item that was not for sale.");
- }
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to buy an item while not in a store.");
- }
-
-
- break;
-
- showError:;
- if (message == 1)
- {
- byte[] inventoryFullMessage = PacketBuilder.CreateChat(Messages.Brought1ButInventoryFull, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(inventoryFullMessage);
- }
- else if (message == 2)
- {
-
- byte[] inventoryFullMessage = PacketBuilder.CreateChat(Messages.Brought5ButInventoryFull, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(inventoryFullMessage);
- }
- else if (message == 3)
- {
-
- byte[] inventoryFullMessage = PacketBuilder.CreateChat(Messages.Brought25ButInventoryFull, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(inventoryFullMessage);
- }
- break;
- case PacketBuilder.ITEM_RIP:
- packetStr = Encoding.UTF8.GetString(packet);
- randomIdStr = packetStr.Substring(2, packet.Length - 2);
- randomId = 0;
- try
- {
- randomId = Int32.Parse(randomIdStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet. " + BitConverter.ToString(packet));
- return;
- }
-
- if (!sender.LoggedinUser.Inventory.HasItem(randomId))
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to rip someone elses mail. " + randomId.ToString());
- return;
- }
-
- InventoryItem ripItems = sender.LoggedinUser.Inventory.GetItemByRandomid(randomId);
- foreach (ItemInstance item in ripItems.ItemInstances)
- {
- if (item.RandomId == randomId)
- {
- if (item.Data == 0)
- continue;
- sender.LoggedinUser.MailBox.RipUpMessage(sender.LoggedinUser.MailBox.GetMessageByRandomId(item.Data));
- break;
- }
- }
- break;
- case PacketBuilder.ITEM_VIEW:
- byte method = packet[2];
- if (method == PacketBuilder.ITEM_LOOK)
- {
- packetStr = Encoding.UTF8.GetString(packet);
- itemIdStr = packetStr.Substring(3, packet.Length - 3);
- itemId = 0;
- try
- {
- itemId = Int32.Parse(itemIdStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet. " + BitConverter.ToString(packet));
- return;
- }
-
- if (itemId == Item.MailMessage)
- {
- if (!sender.LoggedinUser.Inventory.HasItemId(Item.MailMessage))
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to view a mail message when they didnt have one.");
- return;
- }
-
- sender.LoggedinUser.MajorPriority = true;
- byte[] mailList = PacketBuilder.CreateMetaPacket(Meta.BuildMailList(sender.LoggedinUser, sender.LoggedinUser.Inventory.GetItemByItemId(Item.MailMessage)));
- sender.SendPacket(mailList);
- break;
- }
- }
- else if(method == PacketBuilder.ITEM_READ)
- {
- packetStr = Encoding.UTF8.GetString(packet);
- randomIdStr = packetStr.Substring(3, packet.Length - 3);
- randomId = 0;
- try
- {
- randomId = Int32.Parse(randomIdStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet. " + BitConverter.ToString(packet));
- return;
- }
-
- if (!sender.LoggedinUser.Inventory.HasItem(randomId))
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to view someone elses mail. " + randomId.ToString());
- return;
- }
-
- InventoryItem items = sender.LoggedinUser.Inventory.GetItemByRandomid(randomId);
- foreach (ItemInstance item in items.ItemInstances)
- {
- if (item.RandomId == randomId)
- {
- if (item.Data == 0)
- continue;
-
- sender.LoggedinUser.MajorPriority = true;
- byte[] readMail = PacketBuilder.CreateMetaPacket(Meta.BuildMailLetter(sender.LoggedinUser.MailBox.GetMessageByRandomId(item.Data), randomId));
- sender.SendPacket(readMail);
- break;
- }
- }
- break;
-
- }
-
-
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Unknown Method- " + method.ToString("X") + " " + BitConverter.ToString(packet).Replace("-", " "));
- break;
- case PacketBuilder.PACKET_INFORMATION:
- packetStr = Encoding.UTF8.GetString(packet);
- string valueStr = packetStr.Substring(3, packet.Length - 3);
- int value = 0;
- try
- {
- value = Int32.Parse(valueStr);
- }
- catch (FormatException)
- {
- Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet. "+BitConverter.ToString(packet));
- return;
- }
- if (packet[2] == PacketBuilder.ITEM_INFORMATON)
- {
- itemId = -1;
- if (sender.LoggedinUser.Inventory.HasItem(value))
- itemId = sender.LoggedinUser.Inventory.GetItemByRandomid(value).ItemId;
- else if (DroppedItems.IsDroppedItemExist(value))
- itemId = DroppedItems.GetDroppedItemById(value).Instance.ItemId;
- if (itemId == -1)
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " asked for details of non existiant item.");
- return;
- }
- sender.LoggedinUser.MajorPriority = true;
- Item.ItemInformation info = Item.GetItemById(itemId);
- string infoMessage = Meta.BuildItemInfo(info);
- byte[] metaPacket = PacketBuilder.CreateMetaPacket(infoMessage);
- sender.SendPacket(metaPacket);
- }
- if (packet[2] == PacketBuilder.ITEM_INFORMATON_ID)
- {
- sender.LoggedinUser.MajorPriority = true;
- if (!Item.ItemIdExist(value))
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " asked for details of non existiant item.");
- return;
- }
-
- Item.ItemInformation info = Item.GetItemById(value);
- string infoMessage = Meta.BuildItemInfo(info);
- byte[] metaPacket = PacketBuilder.CreateMetaPacket(infoMessage);
- sender.SendPacket(metaPacket);
- }
- else if(packet[2] == PacketBuilder.NPC_INFORMATION)
- {
- if(Npc.NpcExists(value))
- {
- sender.LoggedinUser.MajorPriority = true;
- Npc.NpcEntry npc = Npc.GetNpcById(value);
- string infoMessage = Meta.BuildNpcInfo(npc);
- byte[] metaPacket = PacketBuilder.CreateMetaPacket(infoMessage);
- sender.SendPacket(metaPacket);
- }
- else
- {
- Logger.HackerPrint(sender.LoggedinUser.Username + " asked for details of non existiant npc.");
- return;
- }
- }
-
- break;
- default:
- Logger.WarnPrint(sender.LoggedinUser.Username + " Sent an unknown Item Interaction Packet type: " + action.ToString() + ", Packet Dump: " + BitConverter.ToString(packet).Replace('-', ' '));
- break;
- }
-
- }
- public static void OnInventoryRequested(GameClient sender, byte[] packet)
- {
- if (!sender.LoggedIn)
- {
- Logger.ErrorPrint(sender.RemoteIp + " Sent chat packet when not logged in.");
- return;
- }
-
- if (packet.Length < 2)
- {
- Logger.ErrorPrint(sender.RemoteIp + " Sent an invalid inventory request packet.");
- return;
- }
-
- UpdateInventory(sender);
- }
- public static void OnLoginRequest(GameClient sender, byte[] packet)
- {
- Logger.DebugPrint("Login request received from: " + sender.RemoteIp);
-
- string loginRequestString = Encoding.UTF8.GetString(packet).Substring(1);
-
- if (!loginRequestString.Contains('|') || packet.Length < 3)
- {
- Logger.ErrorPrint(sender.RemoteIp + " Sent an invalid login request");
- return;
- }
-
- if (packet[1] != PacketBuilder.PACKET_CLIENT_TERMINATOR)
- {
- string[] loginParts = loginRequestString.Split('|');
- if (loginParts.Length < 3)
- {
- Logger.ErrorPrint(sender.RemoteIp + " Sent a login request of invalid length. " + loginRequestString);
- return;
- }
-
- int version = int.Parse(loginParts[0]);
- string encryptedUsername = loginParts[1];
- string encryptedPassword = loginParts[2];
- string username = Authentication.DecryptLogin(encryptedUsername);
- string password = Authentication.DecryptLogin(encryptedPassword);
-
- if (Authentication.CheckPassword(username, password))
- {
- // Obtain user information
- int userId = Database.GetUserid(username);
-
- if(Database.IsUserBanned(userId))
- {
- Logger.DebugPrint(sender.RemoteIp + " Tried to login to : " + username + " but, the account was banned.");
- byte[] userBannedPacket = PacketBuilder.CreateLoginPacket(false, Messages.LoginFailedReasonBanned);
- sender.SendPacket(userBannedPacket);
- return;
- }
-
- if(Database.IsIpBanned(sender.RemoteIp))
- {
- Logger.DebugPrint(sender.RemoteIp + " Tried to login to : " + username + " but, the IP was banned.");
- byte[] ipBannedPacket = PacketBuilder.CreateLoginPacket(false, Messages.FormatIpBannedMessage(sender.RemoteIp));
- sender.SendPacket(ipBannedPacket);
- return;
- }
-
-
-
-
- sender.Login(userId);
- sender.LoggedinUser.Password = password;
-
- byte[] ResponsePacket = PacketBuilder.CreateLoginPacket(true);
- sender.SendPacket(ResponsePacket);
-
- Logger.DebugPrint(sender.RemoteIp + " Logged into : " + sender.LoggedinUser.Username + " (ADMIN: " + sender.LoggedinUser.Administrator + " MOD: " + sender.LoggedinUser.Moderator + ")");
-
- }
- else
- {
- Logger.WarnPrint(sender.RemoteIp + " Attempted to login to: " + username + " with incorrect password ");
- byte[] ResponsePacket = PacketBuilder.CreateLoginPacket(false);
- sender.SendPacket(ResponsePacket);
- }
- }
-
- }
-
- public static void OnDisconnect(GameClient sender)
- {
- if (sender.LoggedIn)
- {
- Database.SetPlayerLastLogin(Convert.ToInt32(new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds()), sender.LoggedinUser.Id); // Set last login date
- Database.RemoveOnlineUser(sender.LoggedinUser.Id);
-
- // Leave multirooms
- Multiroom.LeaveAllMultirooms(sender.LoggedinUser);
- TwoPlayer.TwoPlayerRemove(sender.LoggedinUser);
-
- // Remove Trade Reference
- sender.LoggedinUser.TradingWith = null;
- sender.LoggedinUser.PendingTradeTo = 0;
-
- // Leave open water balloon game
- if (WaterBalloonEvent != null)
- if(WaterBalloonEvent.Active)
- WaterBalloonEvent.LeaveEvent(sender.LoggedinUser);
-
- // Leave open quiz.
- if (QuizEvent != null)
- QuizEvent.LeaveEvent(sender.LoggedinUser);
-
- ModsRevengeEvent.LeaveEvent(sender.LoggedinUser);
-
- // Delete Arena Entries
- if (Arena.UserHasEnteredHorseInAnyArena(sender.LoggedinUser))
- {
- Arena arena = Arena.GetArenaUserEnteredIn(sender.LoggedinUser);
- arena.DeleteEntry(sender.LoggedinUser);
- }
-
-
- // Send disconnect message
- byte[] logoutMessageBytes = PacketBuilder.CreateChat(Messages.FormatLogoutMessage(sender.LoggedinUser.Username), PacketBuilder.CHAT_BOTTOM_LEFT);
- foreach (GameClient client in GameClient.ConnectedClients)
- if (client.LoggedIn)
- if (!client.LoggedinUser.MuteLogins && !client.LoggedinUser.MuteAll)
- if (client.LoggedinUser.Id != sender.LoggedinUser.Id)
- client.SendPacket(logoutMessageBytes);
-
- // Tell clients of diconnect (remove from chat)
- byte[] playerRemovePacket = PacketBuilder.CreatePlayerLeavePacket(sender.LoggedinUser.Username);
- foreach (GameClient client in GameClient.ConnectedClients)
- if (client.LoggedIn)
- if (client.LoggedinUser.Id != sender.LoggedinUser.Id)
- client.SendPacket(playerRemovePacket);
- }
-
- }
-
- /*
- * Get(Some Information)
- */
-
-
- public static bool IsUserOnline(int id)
- {
- try
- {
- GetUserById(id);
- return true;
- }
- catch (KeyNotFoundException)
- {
- return false;
- }
- }
-
- public static User[] GetUsersInTown(World.Town town, bool includeStealth = false, bool includeMuted = false)
- {
- List usersInTown = new List();
- foreach (GameClient client in GameClient.ConnectedClients)
- if (client.LoggedIn)
- {
- if (!includeStealth && client.LoggedinUser.Stealth)
- continue;
- if (!includeMuted && client.LoggedinUser.MuteIsland)
- continue;
- if (World.InTown(client.LoggedinUser.X, client.LoggedinUser.Y))
- if (World.GetIsle(client.LoggedinUser.X, client.LoggedinUser.Y).Name == town.Name)
- usersInTown.Add(client.LoggedinUser);
- }
-
- return usersInTown.ToArray();
- }
- public static User[] GetUsersInIsle(World.Isle isle, bool includeStealth = false, bool includeMuted = false)
- {
- List usersInIsle = new List();
- foreach (GameClient client in GameClient.ConnectedClients)
- if (client.LoggedIn)
- {
- if (!includeStealth && client.LoggedinUser.Stealth)
- continue;
- if (!includeMuted && client.LoggedinUser.MuteIsland)
- continue;
- if (World.InIsle(client.LoggedinUser.X, client.LoggedinUser.Y))
- if (World.GetIsle(client.LoggedinUser.X, client.LoggedinUser.Y).Name == isle.Name)
- usersInIsle.Add(client.LoggedinUser);
- }
-
- return usersInIsle.ToArray();
- }
-
- public static User[] GetUsersOnSpecialTileCode(string code)
- {
- List userList = new List();
-
- foreach (GameClient client in GameClient.ConnectedClients)
- {
- if (client.LoggedIn)
- {
-
- if (World.InSpecialTile(client.LoggedinUser.X, client.LoggedinUser.Y))
- {
- World.SpecialTile tile = World.GetSpecialTile(client.LoggedinUser.X, client.LoggedinUser.Y);
-
- if (tile.Code == code)
- {
- userList.Add(client.LoggedinUser);
- }
- }
- }
- }
- return userList.ToArray();
- }
- public static User[] GetUsersAt(int x, int y, bool includeStealth = false, bool includeMuted = false)
- {
- List usersHere = new List();
- foreach(GameClient client in GameClient.ConnectedClients)
- {
- if(client.LoggedIn)
- {
- if (!includeStealth && client.LoggedinUser.Stealth)
- continue;
- if (!includeMuted && client.LoggedinUser.MuteNear)
- continue;
- if (client.LoggedinUser.X == x && client.LoggedinUser.Y == y)
- usersHere.Add(client.LoggedinUser);
- }
- }
- return usersHere.ToArray();
- }
- public static User GetUserByNameStartswith(string username)
- {
- foreach (GameClient client in GameClient.ConnectedClients)
- {
- if (client.LoggedIn)
- {
- if (client.LoggedinUser.Username.ToLower().StartsWith(username.ToLower()))
- return client.LoggedinUser;
- }
- }
- throw new KeyNotFoundException("User was not found.");
- }
-
- public static User GetUserByName(string username)
- {
- foreach(GameClient client in GameClient.ConnectedClients)
- {
- if(client.LoggedIn)
- {
- if (client.LoggedinUser.Username.ToLower() == username.ToLower())
- return client.LoggedinUser;
- }
- }
- throw new KeyNotFoundException("User was not found.");
- }
-
- public static User GetUserById(int id)
- {
- foreach(GameClient client in GameClient.ConnectedClients)
- {
- if (client.LoggedIn)
- if (client.LoggedinUser.Id == id)
- return client.LoggedinUser;
- }
-
- throw new KeyNotFoundException("User not found (not online?)");
- }
-
- public static User[] GetReallyNearbyUsers(int x, int y)
- {
- int startX = x - 3;
- int endX = x + 3;
- int startY = y - 3;
- int endY = y + 3;
- List usersNearby = new List();
-
- foreach (GameClient client in GameClient.ConnectedClients)
- {
- if (client.LoggedIn)
- {
- if (startX <= client.LoggedinUser.X && endX >= client.LoggedinUser.X && startY <= client.LoggedinUser.Y && endY >= client.LoggedinUser.Y)
- usersNearby.Add(client.LoggedinUser);
- }
- }
-
- return usersNearby.ToArray();
- }
-
-
- public static bool IsOnScreen(int screenX, int screenY, int playerX, int playerY)
- {
- int startX = screenX - 9;
- int endX = screenX + 9;
- int startY = screenY - 8;
- int endY = screenY + 9;
- if (startX <= playerX && endX >= playerX && startY <= playerY && endY >= playerY)
- return true;
- else
- return false;
- }
- public static User[] GetOnScreenUsers(int x, int y, bool includeStealth = false, bool includeMuted = false)
- {
-
- List usersOnScreen = new List();
-
- foreach (GameClient client in GameClient.ConnectedClients)
- if (client.LoggedIn)
- {
- if (!includeStealth && client.LoggedinUser.Stealth)
- continue;
- if (!includeMuted && client.LoggedinUser.MuteNear)
- continue;
- if (IsOnScreen(x,y,client.LoggedinUser.X, client.LoggedinUser.Y))
- usersOnScreen.Add(client.LoggedinUser);
- }
-
- return usersOnScreen.ToArray();
- }
-
- public static User[] GetNearbyUsers(int x, int y, bool includeStealth=false, bool includeMuted=false)
- {
- int startX = x - 15;
- int endX = x + 15;
- int startY = y - 19;
- int endY = y + 19;
- List usersNearby = new List();
-
- foreach (GameClient client in GameClient.ConnectedClients)
- {
- if (client.LoggedIn)
- {
- if (!includeStealth && client.LoggedinUser.Stealth)
- continue;
- if (!includeMuted && client.LoggedinUser.MuteNear)
- continue;
- if (startX <= client.LoggedinUser.X && endX >= client.LoggedinUser.X && startY <= client.LoggedinUser.Y && endY >= client.LoggedinUser.Y)
- usersNearby.Add(client.LoggedinUser);
- }
- }
-
- return usersNearby.ToArray();
- }
- public static int GetNumberOfPlayers(bool includeStealth=false)
- {
- int count = 0;
- foreach(GameClient client in GameClient.ConnectedClients)
- if (client.LoggedIn)
- {
- if (!includeStealth && client.LoggedinUser.Stealth)
- continue;
- if (!client.LoggedinUser.Stealth)
- count++;
- }
-
- return count;
- }
-
- public static Point[] GetAllBuddyLocations(User caller)
- {
- List allLocations = new List();
-
- foreach (GameClient client in GameClient.ConnectedClients)
- {
- if (client.LoggedIn)
- {
-
- if (!caller.Friends.List.Contains(client.LoggedinUser.Id))
- continue;
-
-
- if (!client.LoggedinUser.Stealth)
- allLocations.Add(new Point(client.LoggedinUser.X, client.LoggedinUser.Y));
-
- }
- }
-
- return allLocations.ToArray();
- }
-
- public static Point[] GetAllPlayerLocations(User caller)
- {
- List allLocations = new List();
-
- foreach (GameClient client in GameClient.ConnectedClients)
- {
- if (client.LoggedIn)
- {
-
- if (client.LoggedinUser.Id == caller.Id)
- continue;
-
- if (!client.LoggedinUser.Stealth)
- allLocations.Add(new Point(client.LoggedinUser.X, client.LoggedinUser.Y));
-
- }
-
-
- }
- return allLocations.ToArray();
- }
- public static int GetNumberOfPlayersListeningToAdsChat()
- {
- int count = 0;
- foreach (GameClient client in GameClient.ConnectedClients)
- {
- if (client.LoggedIn)
- if (!client.LoggedinUser.MuteAds)
- count++;
- }
- return count;
- }
-
- public static void CheckMail(User user)
- {
- if (user.MailBox.UnreadMailCount > 0)
- {
-
- byte[] RipOffAOLSound = PacketBuilder.CreatePlaysoundPacket(Messages.MailSe);
- user.LoggedinClient.SendPacket(RipOffAOLSound);
-
- byte[] mailReceivedText = PacketBuilder.CreateChat(Messages.MailReceivedMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- user.LoggedinClient.SendPacket(mailReceivedText);
-
- user.MailBox.ReadAllMail();
- }
- }
- public static int GetNumberOfModsOnline()
- {
- int count = 0;
- foreach (GameClient client in GameClient.ConnectedClients)
- {
- if (client.LoggedIn)
- if(client.LoggedinUser.Moderator)
- count++;
- }
- return count;
- }
-
- public static int GetNumberOfBuddiesOnline(User user)
- {
- int total = 0;
- foreach(int bud in user.Friends.List.ToArray())
- {
- if (IsUserOnline(bud))
- {
- total++;
- }
- }
- return total;
- }
-
- public static int GetNumberOfAdminsOnline()
- {
- int count = 0;
- foreach (GameClient client in GameClient.ConnectedClients)
- {
- if (client.LoggedIn)
- if (client.LoggedinUser.Administrator)
- count++;
- }
- return count;
- }
-
- /*
- * Update game state functions.
- */
-
- public static void Update(GameClient client)
- {
- UpdateArea(client);
- foreach (User nearbyUser in GameServer.GetNearbyUsers(client.LoggedinUser.X, client.LoggedinUser.Y, false, false))
- if (nearbyUser.Id != client.LoggedinUser.Id)
- if(!nearbyUser.MajorPriority)
- if(!nearbyUser.MinorPriority)
- UpdateArea(nearbyUser.LoggedinClient);
-
- UpdateUserFacingAndLocation(client.LoggedinUser);
- }
-
- public static void UpdateDrawingForAll(string id, GameClient sender, string drawing, bool includingSender=false)
- {
- World.SpecialTile[] tiles = World.GetSpecialTilesByCode("MULTIROOM-" + id);
- foreach (World.SpecialTile tile in tiles)
- {
- UpdateAreaForAll(tile.X, tile.Y, true, null);
- User[] usersHere = GameServer.GetUsersAt(tile.X, tile.Y, true, true);
- foreach (User user in usersHere)
- {
- if (!includingSender)
- if (user.Id == sender.LoggedinUser.Id)
- continue;
-
- byte[] patchDrawing = PacketBuilder.CreateDrawingUpdatePacket(drawing);
- user.LoggedinClient.SendPacket(patchDrawing);
- }
- }
- }
- public static void UpdateHorseMenu(GameClient forClient, HorseInstance horseInst)
- {
-
- forClient.LoggedinUser.MajorPriority = true;
-
- int TileID = Map.GetTileId(forClient.LoggedinUser.X, forClient.LoggedinUser.Y, false);
- string type = Map.TerrainTiles[TileID - 1].Type;
-
- if (horseInst.Owner == forClient.LoggedinUser.Id)
- forClient.LoggedinUser.LastViewedHorse = horseInst;
- else
- forClient.LoggedinUser.LastViewedHorseOther = horseInst;
-
- byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildHorseInformation(horseInst, forClient.LoggedinUser));
- forClient.SendPacket(metaPacket);
-
- string loadSwf = HorseInfo.BreedViewerSwf(horseInst, type);
- byte[] swfPacket = PacketBuilder.CreateSwfModulePacket(loadSwf, PacketBuilder.PACKET_SWF_MODULE_FORCE);
- forClient.SendPacket(swfPacket);
- }
- public static void UpdateInventory(GameClient forClient)
- {
- if (!forClient.LoggedIn)
- return;
- forClient.LoggedinUser.MajorPriority = true;
- byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildInventoryInfo(forClient.LoggedinUser.Inventory));
- forClient.SendPacket(metaPacket);
- }
-
- public static void UpdateWeather(GameClient forClient)
- {
- if (!forClient.LoggedIn)
- {
- Logger.ErrorPrint(forClient.RemoteIp + "tried to update weather information when not logged in.");
- return;
- }
-
- string lastWeather = forClient.LoggedinUser.LastSeenWeather;
- string weather = forClient.LoggedinUser.GetWeatherSeen();
- if (lastWeather != weather)
- {
- byte[] WeatherUpdate = PacketBuilder.CreateWeatherUpdatePacket(weather);
- forClient.SendPacket(WeatherUpdate);
- }
- }
- public static void UpdateWorld(GameClient forClient)
- {
- if (!forClient.LoggedIn)
- {
- Logger.ErrorPrint(forClient.RemoteIp + "tried to update world information when not logged in.");
- return;
- }
-
- byte[] WorldData = PacketBuilder.CreateWorldData(World.ServerTime.Minutes, World.ServerTime.Days, World.ServerTime.Years, forClient.LoggedinUser.GetWeatherSeen());
- forClient.SendPacket(WorldData);
- }
- public static void UpdatePlayer(GameClient forClient)
- {
- if (!forClient.LoggedIn)
- {
- Logger.ErrorPrint(forClient.RemoteIp + "tried to update player information when not logged in.");
- return;
- }
- byte[] PlayerData = PacketBuilder.CreatePlayerData(forClient.LoggedinUser.Money, GameServer.GetNumberOfPlayers(), forClient.LoggedinUser.MailBox.UnreadMailCount);
- forClient.SendPacket(PlayerData);
- }
-
- public static void UpdateUserFacingAndLocation(User user)
- {
- byte[] playerInfoBytes = PacketBuilder.CreatePlayerInfoUpdateOrCreate(user.X, user.Y, user.Facing, user.CharacterId, user.Username);
-
- foreach (User onScreenUser in GetOnScreenUsers(user.X, user.Y, true, true))
- if (onScreenUser.Id != user.Id)
- onScreenUser.LoggedinClient.SendPacket(playerInfoBytes);
- }
- public static void UpdateAreaForAll(int x, int y, bool ignoreMetaPrio=false, User exceptMe=null)
- {
- foreach(GameClient client in GameClient.ConnectedClients)
- {
- if (client.LoggedIn)
- if (client.LoggedinUser.X == x && client.LoggedinUser.Y == y)
- if(!client.LoggedinUser.MinorPriority || ignoreMetaPrio)
- if(!client.LoggedinUser.MajorPriority)
- if(client.LoggedinUser != exceptMe)
- UpdateArea(client);
- }
- }
-
- public static void UpdateArea(GameClient forClient)
- {
- if(forClient == null)
- {
- Logger.ErrorPrint(forClient.RemoteIp + "tried to update tile information when not connected.");
- return;
- }
- if (!forClient.LoggedIn)
- {
- Logger.ErrorPrint(forClient.RemoteIp + "tried to update tile information when not logged in.");
- return;
- }
-
- if(forClient.LoggedinUser.TradingWith != null)
- {
- if (!forClient.LoggedinUser.TradingWith.OtherTrade.Trader.LoggedinClient.LoggedIn)
- {
- forClient.LoggedinUser.TradingWith.InteruptTrade();
- return;
- }
-
- if (forClient.LoggedinUser.TradingWith.OtherTrade.Trader.TradingWith == null)
- {
- forClient.LoggedinUser.TradingWith.InteruptTrade();
- return;
- }
-
- forClient.LoggedinUser.MajorPriority = true;
- forClient.LoggedinUser.TradeMenuPriority = false;
- byte[] tradeMeta = PacketBuilder.CreateMetaPacket(Meta.BuildTrade(forClient.LoggedinUser.TradingWith));
- forClient.SendPacket(tradeMeta);
- return;
- }
-
- forClient.LoggedinUser.MajorPriority = false;
- forClient.LoggedinUser.MinorPriority = false;
-
- string LocationStr = "";
- int tileX = forClient.LoggedinUser.X;
- int tileY = forClient.LoggedinUser.Y;
- if (!World.InSpecialTile(tileX, tileY))
- {
- if (forClient.LoggedinUser.InRealTimeQuiz)
- return;
- LocationStr = Meta.BuildMetaInfo(forClient.LoggedinUser, tileX, tileY);
- }
- else
- {
- World.SpecialTile specialTile = World.GetSpecialTile(tileX, tileY);
- if (specialTile.AutoplaySwf != null && specialTile.AutoplaySwf != "")
- {
- byte[] swfModulePacket = PacketBuilder.CreateSwfModulePacket(specialTile.AutoplaySwf,PacketBuilder.PACKET_SWF_MODULE_GENTLE);
- forClient.SendPacket(swfModulePacket);
- }
-
- if (forClient.LoggedinUser.InRealTimeQuiz && QuizEvent != null)
- {
- QuizEvent.JoinEvent(forClient.LoggedinUser).UpdateParticipent();
- return;
- }
-
- if (specialTile.Code != null)
- if (!ProcessMapCodeWithArg(forClient, specialTile))
- return;
- LocationStr = Meta.BuildSpecialTileInfo(forClient.LoggedinUser, specialTile);
- }
-
-
- byte[] AreaMessage = PacketBuilder.CreateMetaPacket(LocationStr);
- forClient.SendPacket(AreaMessage);
-
- }
- public static void UpdateStats(GameClient client)
- {
- if (!client.LoggedIn)
- return;
-
- client.LoggedinUser.MajorPriority = true;
- string metaWind = Meta.BuildStatsMenu(client.LoggedinUser);
- byte[] statsPacket = PacketBuilder.CreateMetaPacket(metaWind);
- client.SendPacket(statsPacket);
-
- }
-
- /*
- * Other...
- */
-
- public static void AddItemToAllUsersEvenOffline(int itemId, int itemCount)
- {
- int[] allUsers = Database.GetUsers();
- foreach (int userid in allUsers)
- {
- for (int i = 0; i < itemCount; i++)
- {
- ItemInstance itm = new ItemInstance(itemId);
-
- if (GameServer.IsUserOnline(userid))
- GameServer.GetUserById(userid).Inventory.AddWithoutDatabase(itm);
-
- Database.AddItemToInventory(userid, itm);
- }
- }
- }
-
- public static void RemoveAllItemsOfIdInTheGame(int id)
- {
- // Remove from all online players
- foreach (GameClient connectedClient in GameClient.ConnectedClients)
- {
- if (connectedClient.LoggedIn)
- {
- if (connectedClient.LoggedinUser.Inventory.HasItemId(id))
- {
- InventoryItem invItm = connectedClient.LoggedinUser.Inventory.GetItemByItemId(id);
- foreach (ItemInstance itm in invItm.ItemInstances.ToArray())
- connectedClient.LoggedinUser.Inventory.Remove(itm);
- }
- }
- }
-
- // Remove from shops
- foreach(Shop shop in Shop.ShopList)
- {
- if (shop.Inventory.HasItemId(id))
- {
- InventoryItem invItm = shop.Inventory.GetItemByItemId(id);
- foreach (ItemInstance itm in invItm.ItemInstances.ToArray())
- shop.Inventory.Remove(itm);
- }
-
- }
- DroppedItems.DeleteAllItemsWithId(id); // Delete all dropped items
- Database.DeleteAllItemsFromUsers(id); // Delete from offline players
- }
-
- public static void StartRidingHorse(GameClient sender, int horseRandomId)
- {
- HorseInstance horseMountInst = sender.LoggedinUser.HorseInventory.GetHorseById(horseRandomId);
-
- if (horseMountInst.Breed.Type != "unicorn" && horseMountInst.Breed.Type != "pegasus")
- {
- if (horseMountInst.Equipment.Saddle == null || horseMountInst.Equipment.SaddlePad == null || horseMountInst.Equipment.Bridle == null)
- {
- byte[] horseNotTackedMessage = PacketBuilder.CreateChat(Messages.HorseCannotMountUntilTackedMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(horseNotTackedMessage);
- return;
- }
- }
-
-
- string ridingHorseMessage = Messages.FormatHorseRidingMessage(horseMountInst.Name);
- byte[] ridingHorseMessagePacket = PacketBuilder.CreateChat(ridingHorseMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
- sender.SendPacket(ridingHorseMessagePacket);
-
- sender.LoggedinUser.CurrentlyRidingHorse = horseMountInst;
-
- // Determine what sprite to use;
- int incBy = 0;
- switch (horseMountInst.Color)
- {
- case "brown":
- incBy = 1;
- break;
- case "cremello":
- case "white":
- incBy = 2;
- break;
- case "black":
- incBy = 3;
- break;
- case "chestnut":
- incBy = 4;
- break;
- case "bay":
- incBy = 5;
- break;
- case "grey":
- incBy = 6;
- break;
- case "dun":
- incBy = 7;
- break;
- case "palomino":
- incBy = 8;
- break;
- case "roan":
- incBy = 9;
- break;
- case "pinto":
- incBy = 10;
- break;
- }
-
-
- if (horseMountInst.Breed.Type == "zebra")
- {
- incBy = 11;
- }
- if (horseMountInst.Breed.Id == 5) // Appaloosa
- {
- if (horseMountInst.Color == "cremello")
- incBy = 12;
- }
- if (horseMountInst.Breed.Type == "camel")
- {
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(40)); // Camel Rider
-
- incBy = 13;
- }
- if(horseMountInst.Breed.Type == "llama")
- {
- sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(41)); // Llama Rider
-
- incBy = 14;
- }
- if (horseMountInst.Breed.Type == "unicorn")
- {
- incBy = 15;
- }
- if (horseMountInst.Breed.Type == "pegasus")
- {
- incBy = 16;
- }
- if (horseMountInst.Breed.Id == 170) // Unipeg
- {
- incBy = 17;
- }
-
- incBy *= 5;
- sender.LoggedinUser.Facing %= 5;
- sender.LoggedinUser.Facing += incBy;
- sender.LoggedinUser.LastRiddenHorse = horseRandomId;
-
- UpdateUserFacingAndLocation(sender.LoggedinUser);
-
- byte[] updatePlayer = PacketBuilder.CreateMovementPacket(sender.LoggedinUser.X, sender.LoggedinUser.Y, sender.LoggedinUser.CharacterId, sender.LoggedinUser.Facing, PacketBuilder.DIRECTION_NONE, true);
- sender.SendPacket(updatePlayer);
-
- if (sender.LoggedinUser.HorseWindowOpen)
- UpdateArea(sender);
- }
- public static void DoItemPurchases(GameClient sender)
- {
- if (!sender.LoggedIn)
- return;
-
- Item.ItemPurchaseQueueItem[] queueItems = Database.GetItemPurchaseQueue(sender.LoggedinUser.Id);
- foreach (Item.ItemPurchaseQueueItem queueItem in queueItems)
- {
- for (int i = 0; i < queueItem.ItemCount; i++)
- {
- sender.LoggedinUser.Inventory.AddIgnoringFull(new ItemInstance(queueItem.ItemId));
- }
- }
- Database.ClearItemPurchaseQueue(sender.LoggedinUser.Id);
-
- }
- public static void StopRidingHorse(GameClient sender)
- {
- sender.LoggedinUser.CurrentlyRidingHorse = null;
-
- sender.LoggedinUser.Facing %= 5;
- UpdateUserFacingAndLocation(sender.LoggedinUser);
-
- byte[] updatePlayer = PacketBuilder.CreateMovementPacket(sender.LoggedinUser.X, sender.LoggedinUser.Y, sender.LoggedinUser.CharacterId, sender.LoggedinUser.Facing, PacketBuilder.DIRECTION_NONE, true);
- sender.SendPacket(updatePlayer);
-
- if (sender.LoggedinUser.HorseWindowOpen)
- UpdateArea(sender);
- }
- public static bool ProcessMapCodeWithArg(GameClient forClient, World.SpecialTile tile)
- {
- string mapCode = tile.Code;
- if (mapCode == null)
- return false;
- if(mapCode.Contains('-'))
- {
- string[] codeInfo = mapCode.Split('-');
- string command = codeInfo[0];
- string paramaters = codeInfo[1];
-
- if(command == "JUMP")
- {
- if(paramaters.Contains(','))
- {
- string[] args = paramaters.Split(',');
- try
- {
- int newX = int.Parse(args[0]);
- int newY = int.Parse(args[1]);
- forClient.LoggedinUser.Teleport(newX, newY);
- if (World.InIsle(tile.X, tile.Y))
- {
- World.Isle isle = World.GetIsle(tile.X, tile.Y);
- int tileset = isle.Tileset;
- int overlay = Map.GetTileId(tile.X, tile.Y, true);
- if (tileset == 6 && overlay == 249) // warp point
- {
- byte[] swfPacket = PacketBuilder.CreateSwfModulePacket("warpcutscene", PacketBuilder.PACKET_SWF_CUTSCENE);
- forClient.SendPacket(swfPacket);
- }
- }
- return false;
- }
- catch(Exception)
- {
- return true;
- }
- }
- }
- }
- if(mapCode == "HAMMOCK")
- {
- byte[] hammockText = PacketBuilder.CreateChat(Messages.HammockText, PacketBuilder.CHAT_BOTTOM_RIGHT);
- forClient.SendPacket(hammockText);
-
- forClient.LoggedinUser.Tiredness = 1000;
- foreach(HorseInstance horse in forClient.LoggedinUser.HorseInventory.HorseList)
- {
- horse.BasicStats.Tiredness = 1000;
- }
- }
- return true;
- }
- public static void OnShutdown()
- {
- if(ServerSocket != null)
- ServerSocket.Dispose();
+using HISP.Player;
+using HISP.Game;
+using HISP.Security;
+using HISP.Game.Chat;
+using HISP.Player.Equips;
+using HISP.Game.Services;
+using HISP.Game.Inventory;
+using HISP.Game.SwfModules;
+using HISP.Game.Horse;
+using HISP.Game.Events;
+using HISP.Game.Items;
+
+namespace HISP.Server
+{
+ public class GameServer
+ {
+
+ public static Socket ServerSocket;
+
+ public static int IdleTimeout;
+ public static int IdleWarning;
+
+ public static Random RandomNumberGenerator = new Random();
+
+ // Events
+ public static RealTimeRiddle RiddleEvent = RealTimeRiddle.GetRandomRiddle();
+ public static TackShopGiveaway TackShopGiveawayEvent = null;
+ public static RealTimeQuiz QuizEvent = null;
+ public static WaterBalloonGame WaterBalloonEvent = new WaterBalloonGame();
+ public static IsleCardTradingGame IsleCardTrading;
+ public static ModsRevenge ModsRevengeEvent = new ModsRevenge();
+
+ /*
+ * Private stuff
+ */
+ private static int gameTickSpeed = 4800; // Changing this to ANYTHING else will cause desync with the client.
+ private static int totalMinutesElapsed = 0;
+ private static int oneMinute = 1000 * 60;
+ private static Timer gameTimer; // Controls in-game time.
+ private static Timer minuteTimer; // ticks every real world minute.
+ private static void onGameTick(object state)
+ {
+ // Tick the game clock.
+ World.TickWorldClock();
+
+ // Start all events with this RaceEvery set.
+ Arena.StartArenas(World.ServerTime.Minutes);
+
+ // Decrement horse train timer
+ Database.DecHorseTrainTimeout();
+
+ // Write time to database:
+ Database.SetServerTime(World.ServerTime.Minutes, World.ServerTime.Days, World.ServerTime.Years);
+
+ // Ranch Windmill Payments
+ if (World.ServerTime.Minutes % 720 == 0) // every 12 hours
+ {
+ Logger.DebugPrint("Paying windmill owners . . . ");
+ foreach (Ranch ranch in Ranch.Ranches)
+ {
+ int ranchOwner = ranch.OwnerId;
+ if (ranchOwner != -1)
+ {
+ int moneyToAdd = 5000 * ranch.GetBuildingCount(8); // Windmill
+ if (GameServer.IsUserOnline(ranchOwner))
+ GameServer.GetUserById(ranchOwner).AddMoney(moneyToAdd);
+ else
+ {
+ try
+ {
+ Database.SetPlayerMoney(Database.GetPlayerMoney(ranchOwner) + moneyToAdd, ranchOwner);
+ }
+ catch (OverflowException)
+ {
+ Database.SetPlayerMoney(2147483647, ranchOwner);
+ }
+ }
+ }
+ }
+ }
+
+ if((World.StartDate != -1)) // Birthday tokens
+ {
+ int curTime = (int)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
+ if (curTime >= World.StartDate + 378691200)
+ {
+ Logger.InfoPrint("Your server has been running for 12 years! Adding birthday tokens");
+ Database.SetStartTime(-1);
+ World.StartDate = -1;
+
+
+ AddItemToAllUsersEvenOffline(Item.BirthdayToken, 10);
+ }
+
+ }
+
+ gameTimer.Change(gameTickSpeed, gameTickSpeed);
+
+ }
+ private static void onMinuteTick(object state)
+ {
+ totalMinutesElapsed++;
+
+ if (totalMinutesElapsed % 8 == 0)
+ {
+ Database.IncAllUsersFreeTime(1);
+ }
+
+ if (totalMinutesElapsed % 25 == 0)
+ {
+
+ Logger.DebugPrint("Randomizing Weather...");
+ foreach (World.Town town in World.Towns)
+ {
+ if (RandomNumberGenerator.Next(0, 100) < 25)
+ {
+ town.Weather = town.SelectRandomWeather();
+ }
+ }
+
+ foreach (World.Isle isle in World.Isles)
+ {
+ if (RandomNumberGenerator.Next(0, 100) < 25)
+ {
+ isle.Weather = isle.SelectRandomWeather();
+ }
+ }
+ }
+
+ /*
+ * EVENTS
+ */
+
+ // Mods Revenge
+ if(totalMinutesElapsed % ((60*8)+15) == 0)
+ {
+ ModsRevengeEvent.StartEvent();
+ }
+
+ // Isle Card Trading Game
+ if(totalMinutesElapsed % (60 *2) == 0)
+ {
+ IsleCardTrading = new IsleCardTradingGame();
+ IsleCardTrading.StartEvent();
+ }
+
+ // Water Balloon Game
+ if(totalMinutesElapsed % (60 * 2) == 0)
+ {
+ WaterBalloonEvent.StartEvent();
+ }
+
+ // Tack Shop Giveaway
+ if(totalMinutesElapsed % ((60 * 3)+5) == 0)
+ {
+ TackShopGiveawayEvent = new TackShopGiveaway();
+ TackShopGiveawayEvent.StartEvent();
+ }
+
+ // Real Time Riddle
+ if(totalMinutesElapsed % (RealTimeRiddle.LastWon ? 20 : 15) == 0)
+ {
+ RiddleEvent = RealTimeRiddle.GetRandomRiddle();
+ RiddleEvent.StartEvent();
+ }
+
+ // Real Time Quiz
+ if(totalMinutesElapsed % (60 + 30) == 0)
+ {
+ QuizEvent = new RealTimeQuiz();
+ QuizEvent.StartEvent();
+ }
+
+
+ if (totalMinutesElapsed % 60 == 0) // Do spoils
+ {
+ foreach (HorseInstance horse in Database.GetMostSpoiledHorses())
+ {
+ horse.BasicStats.Health = 1000;
+ horse.BasicStats.Mood = 1000;
+ horse.BasicStats.Hunger = 1000;
+ horse.BasicStats.Thirst = 1000;
+ }
+ }
+
+ if (totalMinutesElapsed % 5 == 0)
+ {
+ Treasure.AddValue();
+ }
+
+
+ foreach (GameClient client in GameClient.ConnectedClients)
+ {
+ if (client == null)
+ continue;
+
+ if (client.LoggedIn)
+ {
+ if (!client.LoggedinUser.MajorPriority)
+ if(!client.LoggedinUser.MinorPriority)
+ UpdateArea(client);
+ byte[] BaseStatsPacketData = PacketBuilder.CreatePlayerData(client.LoggedinUser.Money, GameServer.GetNumberOfPlayers(), client.LoggedinUser.MailBox.UnreadMailCount);
+ client.SendPacket(BaseStatsPacketData);
+
+ UpdateWorld(client);
+ UpdatePlayer(client);
+ }
+ }
+
+ foreach(Auction auction in Auction.AuctionRooms.ToArray())
+ {
+ foreach(Auction.AuctionEntry entry in auction.AuctionEntries.ToArray())
+ {
+ entry.TimeRemaining--;
+ if (entry.Completed)
+ auction.DeleteEntry(entry);
+ else if (entry.TimeRemaining <= 0)
+ entry.Completed = true;
+
+ auction.UpdateAuctionRoom();
+ }
+ }
+
+
+
+ Database.IncPlayerTirednessForOfflineUsers();
+
+ // Offline player handling w sql black magic...
+
+ Database.DecrementHorseLeaseTimeForOfflinePlayers();
+ Database.TpOfflinePlayersBackToUniterForOfflinePlayers();
+ Database.DeleteExpiredLeasedHorsesForOfflinePlayers();
+
+ DroppedItems.DespawnItems();
+ DroppedItems.GenerateItems();
+
+
+ WildHorse.Update();
+ Npc.WanderNpcs();
+ minuteTimer.Change(oneMinute, oneMinute);
+ }
+
+ /*
+ * 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, byte[] packet)
+ {
+ if (Encoding.UTF8.GetString(packet).StartsWith(""))
+ {
+ Logger.DebugPrint("Cross-Domain-Policy request received from: " + sender.RemoteIp);
+ byte[] crossDomainPolicyResponse = CrossDomainPolicy.GetPolicy();
+ sender.SendPacket(crossDomainPolicyResponse);
+
+ }
+ }
+
+ public static void OnPlayerInteration(GameClient sender, byte[] packet)
+ {
+ if (!sender.LoggedIn)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " Requested Bird Map when not logged in.");
+ return;
+ }
+ byte method = packet[1];
+ switch(method)
+ {
+ case PacketBuilder.PLAYER_INTERACTION_TRADE_REJECT:
+ if (sender.LoggedinUser.TradingWith != null)
+ sender.LoggedinUser.TradingWith.CancelTrade();
+ break;
+ case PacketBuilder.PLAYER_INTERACTION_ACCEPT:
+ if (sender.LoggedinUser.TradingWith != null)
+ sender.LoggedinUser.TradingWith.AcceptTrade();
+ break;
+ case PacketBuilder.PLAYER_INTERACTION_PROFILE:
+ string packetStr = Encoding.UTF8.GetString(packet);
+ string playerIdStr = packetStr.Substring(2, packetStr.Length - 4);
+ int playerId = -1;
+ try
+ {
+ playerId = int.Parse(playerIdStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to view profile of User ID NaN.");
+ break;
+ }
+
+ if(IsUserOnline(playerId))
+ {
+ User user = GetUserById(playerId);
+ sender.LoggedinUser.MajorPriority = true;
+
+ byte[] metaTag = PacketBuilder.CreateMetaPacket(Meta.BuildStatsMenu(user, true));
+ sender.SendPacket(metaTag);
+ }
+ break;
+ case PacketBuilder.PLAYER_INTERACTION_MUTE:
+ packetStr = Encoding.UTF8.GetString(packet);
+ playerIdStr = packetStr.Substring(2, packetStr.Length - 4);
+ playerId = -1;
+ try
+ {
+ playerId = int.Parse(playerIdStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to MUTE User ID NaN.");
+ break;
+ }
+
+ if (IsUserOnline(playerId))
+ {
+ User user = GetUserById(playerId);
+ if(!sender.LoggedinUser.MutePlayer.IsUserMuted(user))
+ sender.LoggedinUser.MutePlayer.MuteUser(user);
+
+ byte[] nowMuting = PacketBuilder.CreateChat(Messages.FormatNowMutingPlayer(user.Username), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(nowMuting);
+
+ sender.LoggedinUser.MajorPriority = true;
+ byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildPlayerListMenu(sender.LoggedinUser));
+ sender.SendPacket(metaPacket);
+ }
+ break;
+ case PacketBuilder.PLAYER_INTERACTION_UNMUTE:
+ packetStr = Encoding.UTF8.GetString(packet);
+ playerIdStr = packetStr.Substring(2, packetStr.Length - 4);
+ playerId = -1;
+ try
+ {
+ playerId = int.Parse(playerIdStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to UNMUTE User ID NaN.");
+ break;
+ }
+
+ if (IsUserOnline(playerId))
+ {
+ User user = GetUserById(playerId);
+ if (sender.LoggedinUser.MutePlayer.IsUserMuted(user))
+ sender.LoggedinUser.MutePlayer.UnmuteUser(user);
+
+ byte[] stoppedMuting = PacketBuilder.CreateChat(Messages.FormatStoppedMutingPlayer(user.Username), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(stoppedMuting);
+
+ sender.LoggedinUser.MajorPriority = true;
+ byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildPlayerListMenu(sender.LoggedinUser));
+ sender.SendPacket(metaPacket);
+ }
+ break;
+ case PacketBuilder.PLAYER_INTERACTION_REMOVE_BUDDY:
+ packetStr = Encoding.UTF8.GetString(packet);
+ playerIdStr = packetStr.Substring(2, packetStr.Length - 4);
+ playerId = -1;
+ try
+ {
+ playerId = int.Parse(playerIdStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to remove User ID NaN as a buddy.");
+ break;
+ }
+
+
+ if(sender.LoggedinUser.Friends.IsFriend(playerId))
+ {
+ sender.LoggedinUser.Friends.RemoveFriend(playerId);
+
+ byte[] friendRemoved = PacketBuilder.CreateChat(Messages.FormatAddBuddyRemoveBuddy(Database.GetUsername(playerId)), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(friendRemoved);
+
+ sender.LoggedinUser.MajorPriority = true;
+ byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildPlayerListMenu(sender.LoggedinUser));
+ sender.SendPacket(metaPacket);
+ }
+
+ break;
+ case PacketBuilder.PLAYER_INTERACTION_TAG:
+ packetStr = Encoding.UTF8.GetString(packet);
+ playerIdStr = packetStr.Substring(2, packetStr.Length - 4);
+ playerId = -1;
+ try
+ {
+ playerId = int.Parse(playerIdStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to trade with User ID NaN.");
+ break;
+ }
+
+ if (IsUserOnline(playerId))
+ {
+ User user = GetUserById(playerId);;
+ string TAGYourIT = Messages.FormatTagYourIt(user.Username, sender.LoggedinUser.Username);
+ int totalBuds = 0;
+ foreach(int friendId in sender.LoggedinUser.Friends.List)
+ {
+ if (friendId == sender.LoggedinUser.Id)
+ continue;
+
+ if(IsUserOnline(friendId))
+ {
+ User buddy = GetUserById(friendId);
+ byte[] tagYourItPacket = PacketBuilder.CreateChat(TAGYourIT, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ buddy.LoggedinClient.SendPacket(tagYourItPacket);
+ totalBuds++;
+ }
+ }
+ string budStr = Messages.FormatTagTotalBuddies(totalBuds);
+
+ byte[] tagYouItPacket = PacketBuilder.CreateChat(TAGYourIT + budStr, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(tagYouItPacket);
+
+ }
+ break;
+ case PacketBuilder.PLAYER_INTERACTION_ADD_BUDDY:
+ packetStr = Encoding.UTF8.GetString(packet);
+ playerIdStr = packetStr.Substring(2, packetStr.Length - 4);
+ playerId = -1;
+ try
+ {
+ playerId = int.Parse(playerIdStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to add friend with User ID NaN.");
+ break;
+ }
+ if (IsUserOnline(playerId))
+ {
+ User userToAdd = GetUserById(playerId);
+ sender.LoggedinUser.Friends.AddFriend(userToAdd);
+ }
+ break;
+ case PacketBuilder.PLAYER_INTERACTION_ADD_ITEM:
+ if (sender.LoggedinUser.TradingWith == null)
+ break;
+ if (packet.Length < 5)
+ break;
+
+ packetStr = Encoding.UTF8.GetString(packet);
+ string idStr = packetStr.Substring(2, packetStr.Length - 4);
+ char firstChar = idStr[0];
+ switch(firstChar)
+ {
+ case '3': // Trade Money
+
+ if (sender.LoggedinUser.Bids.Length > 0)
+ {
+ byte[] cantBuyWhileAuctioning = PacketBuilder.CreateChat(Messages.AuctionNoOtherTransactionAllowed, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantBuyWhileAuctioning);
+ break;
+ }
+
+ sender.LoggedinUser.TradeMenuPriority = true;
+ sender.LoggedinUser.AttemptingToOfferItem = -1;
+ byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildTradeAddMoney(sender.LoggedinUser.TradingWith.MoneyOffered));
+ sender.SendPacket(metaPacket);
+
+ break;
+ case '2': // Trade Horse
+ string horseRandomIdStr = idStr.Substring(1);
+ int horseRandomId = -1;
+ try
+ {
+ horseRandomId = int.Parse(horseRandomIdStr);
+ }
+ catch (FormatException)
+ {
+ break;
+ }
+
+ if (!sender.LoggedinUser.HorseInventory.HorseIdExist(horseRandomId))
+ break;
+
+ HorseInstance horse = sender.LoggedinUser.HorseInventory.GetHorseById(horseRandomId);
+ if(!sender.LoggedinUser.TradingWith.HorsesOffered.Contains(horse))
+ sender.LoggedinUser.TradingWith.OfferHorse(horse);
+
+ UpdateArea(sender);
+
+ if (sender.LoggedinUser.TradingWith != null)
+ if (!sender.LoggedinUser.TradingWith.OtherTrade.Trader.TradeMenuPriority)
+ UpdateArea(sender.LoggedinUser.TradingWith.OtherTrade.Trader.LoggedinClient);
+
+ break;
+ case '1': // Trade Item
+ string itemIdStr = idStr.Substring(1);
+ int itemId = -1;
+ try
+ {
+ itemId = int.Parse(itemIdStr);
+ }
+ catch(FormatException)
+ {
+ break;
+ }
+
+ if (!sender.LoggedinUser.Inventory.HasItemId(itemId))
+ break;
+
+ sender.LoggedinUser.TradeMenuPriority = true;
+ sender.LoggedinUser.AttemptingToOfferItem = itemId;
+ InventoryItem item = sender.LoggedinUser.Inventory.GetItemByItemId(itemId);
+ byte[] addItemPacket = PacketBuilder.CreateMetaPacket(Meta.BuildTradeAddItem(item.ItemInstances.Length));
+ sender.SendPacket(addItemPacket);
+ break;
+
+ }
+ break;
+ case PacketBuilder.PLAYER_INTERACTION_TRADE:
+ packetStr = Encoding.UTF8.GetString(packet);
+ playerIdStr = packetStr.Substring(2, packetStr.Length - 4);
+ playerId = -1;
+ try
+ {
+ playerId = int.Parse(playerIdStr);
+ }
+ catch(FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to trade with User ID NaN.");
+ break;
+ }
+ if(IsUserOnline(playerId))
+ {
+ User user = GetUserById(playerId);
+ byte[] tradeMsg = PacketBuilder.CreateChat(Messages.TradeRequiresBothPlayersMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(tradeMsg);
+
+ sender.LoggedinUser.PendingTradeTo = user.Id;
+
+ if (user.PendingTradeTo == sender.LoggedinUser.Id)
+ {
+ // Start Trade
+ Trade tradeWithYou = new Trade(sender.LoggedinUser);
+ Trade tradeWithOther = new Trade(user);
+ tradeWithYou.OtherTrade = tradeWithOther;
+ tradeWithOther.OtherTrade = tradeWithYou;
+
+ sender.LoggedinUser.TradingWith = tradeWithYou;
+ user.TradingWith = tradeWithOther;
+
+ UpdateArea(sender);
+ UpdateArea(user.LoggedinClient);
+ }
+
+ }
+ break;
+ default:
+ Logger.DebugPrint("Unknown Player interaction Method: 0x" + method.ToString("X") + " Packet: "+BitConverter.ToString(packet).Replace("-", " "));
+ break;
+ }
+ return;
+ }
+ public static void OnSocialPacket(GameClient sender, byte[] packet)
+ {
+ if (!sender.LoggedIn)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " Tried to be socialable, but has no account and therefor no friends.");
+ return;
+ }
+ byte method = packet[1];
+
+ switch (method)
+ {
+ case PacketBuilder.SOCIALS_MENU:
+ string packetStr = Encoding.UTF8.GetString(packet);
+ string playerIdStr = packetStr.Substring(2, packetStr.Length - 4);
+ int playerId = -1;
+ try
+ {
+ playerId = int.Parse(playerIdStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to socialize with User ID NaN.");
+ break;
+ }
+
+ if(IsUserOnline(playerId))
+ {
+ sender.LoggedinUser.SocializingWith = GetUserById(playerId);
+
+ sender.LoggedinUser.SocializingWith.AddSocailizedWith(sender.LoggedinUser);
+ sender.LoggedinUser.MajorPriority = true;
+ byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildSocialMenu(sender.LoggedinUser.CurrentlyRidingHorse != null));
+ sender.SendPacket(metaPacket);
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to socialize with User #"+playerId.ToString()+" but there not online.");
+ }
+ break;
+ case PacketBuilder.SOCIALS_USE:
+ int socialId = Convert.ToInt32(packet[2] - (byte)0x21);
+ SocialType.Social social = SocialType.GetSocial(socialId);
+ /*
+ * Check if player being socialed with
+ * is actually on this tile, not muted, etc
+ */
+ if (sender.LoggedinUser.SocializingWith != null && social.BaseSocialType.Type != "GROUP")
+ {
+ if (sender.LoggedinUser.SocializingWith.MuteAll || sender.LoggedinUser.SocializingWith.MuteSocials)
+ {
+ byte[] cantSocialize = PacketBuilder.CreateChat(Messages.PlayerIgnoringAllSocials, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantSocialize);
+ break;
+ }
+
+ if (sender.LoggedinUser.SocializingWith.MutePlayer.IsUserMuted(sender.LoggedinUser))
+ {
+ byte[] cantSocialize = PacketBuilder.CreateChat(Messages.PlayerIgnoringYourSocials, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantSocialize);
+ break;
+ }
+
+ if(sender.LoggedinUser.SocializingWith.X != sender.LoggedinUser.X && sender.LoggedinUser.SocializingWith.Y != sender.LoggedinUser.Y)
+ {
+ byte[] playerNotNearby = PacketBuilder.CreateChat(Messages.SocialPlayerNoLongerNearby, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(playerNotNearby);
+ break;
+ }
+ }
+
+
+ if(social.ForEveryone != null)
+ {
+ foreach (User user in GetUsersAt(sender.LoggedinUser.X, sender.LoggedinUser.Y, true, true))
+ {
+ if (social.BaseSocialType.Type != "GROUP")
+ if (user.Id == sender.LoggedinUser.SocializingWith.Id)
+ continue;
+
+ if (user.Id == sender.LoggedinUser.Id)
+ continue;
+
+ if (user.MuteAll || user.MuteSocials)
+ continue;
+ string socialTarget = "";
+ if(sender.LoggedinUser.SocializingWith != null)
+ socialTarget = sender.LoggedinUser.SocializingWith.Username;
+ byte[] msgEveryone = PacketBuilder.CreateChat(Messages.FormatSocialMessage(social.ForEveryone, socialTarget, sender.LoggedinUser.Username), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ user.LoggedinClient.SendPacket(msgEveryone);
+ }
+
+ }
+ if(social.ForTarget != null)
+ {
+ if(sender.LoggedinUser.SocializingWith != null)
+ {
+ if (social.BaseSocialType.Type != "GROUP")
+ {
+ byte[] msgTarget = PacketBuilder.CreateChat(Messages.FormatSocialMessage(social.ForTarget, sender.LoggedinUser.SocializingWith.Username, sender.LoggedinUser.Username), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.LoggedinUser.SocializingWith.LoggedinClient.SendPacket(msgTarget);
+ }
+ }
+ }
+ if(social.ForSender != null)
+ {
+ string socialTarget = "";
+ if (sender.LoggedinUser.SocializingWith != null)
+ socialTarget = sender.LoggedinUser.SocializingWith.Username;
+
+ byte[] msgSender = PacketBuilder.CreateChat(Messages.FormatSocialMessage(social.ForSender, socialTarget, sender.LoggedinUser.Username), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(msgSender);
+
+
+ }
+
+ if (social.SoundEffect != null)
+ {
+ foreach (User user in GetUsersAt(sender.LoggedinUser.X, sender.LoggedinUser.Y, true, true))
+ {
+
+ if (user.MuteAll || user.MuteSocials)
+ continue;
+
+ byte[] soundEffect = PacketBuilder.CreatePlaysoundPacket(social.SoundEffect);
+ user.LoggedinClient.SendPacket(soundEffect);
+ }
+ }
+
+ break;
+ default:
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " unknown social: " + method.ToString("X") + " packet dump: " + BitConverter.ToString(packet).Replace("-", " "));
+ break;
+ }
+
+ }
+ public static void OnBirdMapRequested(GameClient sender, byte[] packet)
+ {
+ if (!sender.LoggedIn)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " Requested Bird Map when not logged in.");
+ return;
+ }
+
+ if(sender.LoggedinUser.Inventory.HasItemId(Item.Telescope))
+ {
+ byte[] birdMapPacket = PacketBuilder.CreateBirdMap(sender.LoggedinUser.X, sender.LoggedinUser.Y);
+ sender.SendPacket(birdMapPacket);
+ }
+ else
+ {
+ byte[] noTelescopeMessage = PacketBuilder.CreateChat(Messages.NoTelescope, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(noTelescopeMessage);
+ }
+ }
+
+ public static void OnAuctionPacket(GameClient sender, byte[] packet)
+ {
+ if (!sender.LoggedIn)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " Sent auction packet when not logged in.");
+ return;
+ }
+ if (packet.Length < 4)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid sized auction packet: " + BitConverter.ToString(packet).Replace("-", " "));
+ return;
+ }
+ byte method = packet[1];
+ int bidAmount = 0;
+ switch (method)
+ {
+ case PacketBuilder.AUCTION_BID_100:
+ bidAmount = 100;
+ goto doBids;
+ case PacketBuilder.AUCTION_BID_1K:
+ bidAmount = 1000;
+ goto doBids;
+ case PacketBuilder.AUCTION_BID_10K:
+ bidAmount = 10000;
+ goto doBids;
+ case PacketBuilder.AUCTION_BID_100K:
+ bidAmount = 100000;
+ goto doBids;
+ case PacketBuilder.AUCTION_BID_1M:
+ bidAmount = 1000000;
+ goto doBids;
+ case PacketBuilder.AUCTION_BID_10M:
+ bidAmount = 10000000;
+ goto doBids;
+ case PacketBuilder.AUCITON_BID_100M:
+ bidAmount = 100000000;
+ doBids:;
+ if(World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
+ {
+ World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
+ if(tile.Code != null)
+ {
+ if(tile.Code.StartsWith("AUCTION-"))
+ {
+ Auction auctionRoom = Auction.GetAuctionRoomById(int.Parse(tile.Code.Split('-')[1]));
+ int auctionEntryId = -1;
+ string packetStr = Encoding.UTF8.GetString(packet);
+ string auctionEntryStr = packetStr.Substring(2, packetStr.Length - 4);
+ try
+ {
+ auctionEntryId = int.Parse(auctionEntryStr);
+ }
+ catch(FormatException)
+ {
+ Logger.ErrorPrint("Cant find auciton entry id NaN.");
+ break;
+ }
+ if (!auctionRoom.HasAuctionEntry(auctionEntryId))
+ break;
+
+ Auction.AuctionEntry entry = auctionRoom.GetAuctionEntry(auctionEntryId);
+ entry.Bid(sender.LoggedinUser, bidAmount);
+
+ UpdateAreaForAll(tile.X, tile.Y, true, null);
+ }
+ }
+ }
+ break;
+ default:
+ Logger.ErrorPrint("Unknown method id: 0x" + method.ToString("X"));
+ break;
+
+ }
+
+ }
+ public static void OnHorseInteraction(GameClient sender, byte[] packet)
+ {
+ if (!sender.LoggedIn)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " Sent horse interaction when not logged in.");
+ return;
+ }
+
+ if(packet.Length < 3)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid sized horse interaction packet: " + BitConverter.ToString(packet).Replace("-", " "));
+ return;
+ }
+
+ byte method = packet[1];
+ switch(method)
+ {
+ case PacketBuilder.HORSE_LIST:
+ sender.LoggedinUser.MajorPriority = true;
+ byte[] metaTags = PacketBuilder.CreateMetaPacket(Meta.BuildHorseInventory(sender.LoggedinUser));
+ sender.SendPacket(metaTags);
+ break;
+ case PacketBuilder.HORSE_PROFILE:
+ byte methodProfileEdit = packet[2];
+ if(methodProfileEdit == PacketBuilder.HORSE_PROFILE_EDIT)
+ {
+ if (sender.LoggedinUser.LastViewedHorse != null)
+ {
+ sender.LoggedinUser.MajorPriority = true;
+ byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildHorseDescriptionEditMeta(sender.LoggedinUser.LastViewedHorse));
+ sender.SendPacket(metaPacket);
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + "Trying to edit description of no horse");
+ }
+ }
+ else
+ {
+ Logger.InfoPrint(BitConverter.ToString(packet).Replace("-", " "));
+ }
+ break;
+ case PacketBuilder.HORSE_FEED:
+ int randomId = 0;
+ string packetStr = Encoding.UTF8.GetString(packet);
+ string randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
+ try
+ {
+ randomId = int.Parse(randomIdStr);
+
+ }
+ catch (Exception)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
+ break;
+ }
+ if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
+ {
+ HorseInstance horseFeedInst = sender.LoggedinUser.HorseInventory.GetHorseById(randomId);
+
+ sender.LoggedinUser.LastViewedHorse = horseFeedInst;
+ sender.LoggedinUser.MajorPriority = true;
+ byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildHorseFeedMenu(horseFeedInst, sender.LoggedinUser));
+ sender.SendPacket(metaPacket);
+ break;
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to feed at a non existant horse.");
+ break;
+ }
+ case PacketBuilder.HORSE_PET:
+ randomId = 0;
+ packetStr = Encoding.UTF8.GetString(packet);
+ randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
+ try
+ {
+ randomId = int.Parse(randomIdStr);
+
+ }
+ catch (Exception)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
+ break;
+ }
+ if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
+ {
+ HorseInstance horsePetInst = sender.LoggedinUser.HorseInventory.GetHorseById(randomId);
+ sender.LoggedinUser.LastViewedHorse = horsePetInst;
+ int randMoodAddition = RandomNumberGenerator.Next(1, 20);
+ int randTiredMinus = RandomNumberGenerator.Next(1, 10);
+
+
+
+ string msgs = "";
+ if (horsePetInst.BasicStats.Mood + randMoodAddition >= 1000)
+ {
+ msgs += Messages.HorsePetTooHappy;
+ }
+
+ if (horsePetInst.BasicStats.Tiredness - randTiredMinus <= 0)
+ {
+ msgs += Messages.HorsePetTooTired;
+ }
+
+ horsePetInst.BasicStats.Tiredness -= randTiredMinus;
+ horsePetInst.BasicStats.Mood += randMoodAddition;
+
+ byte[] petMessagePacket = PacketBuilder.CreateChat(Messages.FormatHorsePetMessage(msgs,randMoodAddition, randTiredMinus), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(petMessagePacket);
+
+ break;
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to feed at a non existant horse.");
+ break;
+ }
+ case PacketBuilder.HORSE_VET_SERVICE_ALL:
+
+ if (World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
+ {
+ World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
+ if(tile.Code != null)
+ {
+ if (tile.Code.StartsWith("VET-"))
+ {
+ string[] vetInfo = tile.Code.Split('-');
+ int vetId = int.Parse(vetInfo[1]);
+ Vet vet = Vet.GetVetById(vetId);
+ int price = 0;
+
+ foreach (HorseInstance horse in sender.LoggedinUser.HorseInventory.HorseList)
+ price += vet.CalculatePrice(horse.BasicStats.Health);
+ if (price == 0)
+ {
+ byte[] notNeededMessagePacket = PacketBuilder.CreateChat(Messages.VetServicesNotNeededAll, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(notNeededMessagePacket);
+ break;
+ }
+ else if (sender.LoggedinUser.Money >= price)
+ {
+ foreach (HorseInstance horse in sender.LoggedinUser.HorseInventory.HorseList)
+ horse.BasicStats.Health = 1000;
+
+ byte[] healedMessagePacket = PacketBuilder.CreateChat(Messages.VetAllFullHealthRecoveredMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(healedMessagePacket);
+
+ sender.LoggedinUser.TakeMoney(price);
+
+ }
+ else
+ {
+ byte[] cannotAffordMessagePacket = PacketBuilder.CreateChat(Messages.VetCannotAffordMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cannotAffordMessagePacket);
+ break;
+ }
+ UpdateArea(sender);
+ }
+
+ }
+ }
+ break;
+ case PacketBuilder.HORSE_VET_SERVICE:
+ randomId = 0;
+ packetStr = Encoding.UTF8.GetString(packet);
+ randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
+
+ if (randomIdStr == "NaN")
+ break;
+
+ try
+ {
+ randomId = int.Parse(randomIdStr);
+ }
+ catch (Exception)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
+ break;
+ }
+ if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
+ {
+ HorseInstance horseVetServiceInst = sender.LoggedinUser.HorseInventory.GetHorseById(randomId);
+ sender.LoggedinUser.LastViewedHorse = horseVetServiceInst;
+
+ if(World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
+ {
+ World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
+ if(tile.Code != null)
+ {
+ if (tile.Code.StartsWith("VET-"))
+ {
+ string[] vetInfo = tile.Code.Split('-');
+ int vetId = int.Parse(vetInfo[1]);
+
+ Vet vet = Vet.GetVetById(vetId);
+ int price = vet.CalculatePrice(horseVetServiceInst.BasicStats.Health);
+ if (sender.LoggedinUser.Money >= price)
+ {
+ horseVetServiceInst.BasicStats.Health = 1000;
+ sender.LoggedinUser.TakeMoney(price);
+
+ byte[] messagePacket = PacketBuilder.CreateChat(Messages.FormatVetHorseAtFullHealthMessage(horseVetServiceInst.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(messagePacket);
+ }
+ else
+ {
+ byte[] cantAffordMessage = PacketBuilder.CreateChat(Messages.VetCannotAffordMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantAffordMessage);
+ break;
+ }
+ UpdateArea(sender);
+ }
+
+ }
+ }
+ break;
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to use vet services on a non existant horse.");
+ break;
+ }
+ case PacketBuilder.HORSE_SHOE_STEEL:
+ case PacketBuilder.HORSE_SHOE_IRON:
+ randomId = 0;
+ packetStr = Encoding.UTF8.GetString(packet);
+ randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
+
+ if (randomIdStr == "NaN")
+ break;
+
+ try
+ {
+ randomId = int.Parse(randomIdStr);
+ }
+ catch (Exception)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
+ break;
+ }
+ if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
+ {
+ HorseInstance horseFarrierServiceInst = sender.LoggedinUser.HorseInventory.GetHorseById(randomId);
+ sender.LoggedinUser.LastViewedHorse = horseFarrierServiceInst;
+
+ if (World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
+ {
+ World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
+ if(tile.Code != null)
+ {
+ if (tile.Code.StartsWith("FARRIER-"))
+ {
+ string[] farrierInfo = tile.Code.Split('-');
+ int farrierId = int.Parse(farrierInfo[1]);
+
+ Farrier farrier = Farrier.GetFarrierById(farrierId);
+ int price = 0;
+ int incAmount = 0;
+ string msg = "";
+
+ if (method == PacketBuilder.HORSE_SHOE_STEEL)
+ {
+ price = farrier.SteelCost;
+ incAmount = farrier.SteelShoesAmount;
+ msg = Messages.FormatFarrierPutOnSteelShoesMessage(incAmount, 1000);
+ }
+ else
+ {
+ price = farrier.IronCost;
+ incAmount = farrier.IronShoesAmount;
+ msg = Messages.FormatFarrierPutOnIronShoesMessage(incAmount, 1000);
+ }
+
+ if (sender.LoggedinUser.Money >= price)
+ {
+ horseFarrierServiceInst.BasicStats.Shoes = incAmount;
+ sender.LoggedinUser.TakeMoney(price);
+
+ byte[] messagePacket = PacketBuilder.CreateChat(msg, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(messagePacket);
+ }
+ else
+ {
+ byte[] cantAffordMessage = PacketBuilder.CreateChat(Messages.FarrierShoesCantAffordMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantAffordMessage);
+ break;
+ }
+ UpdateArea(sender);
+ }
+
+ }
+ }
+ break;
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to use farrier services on a non existant horse.");
+ break;
+ }
+ case PacketBuilder.HORSE_SHOE_ALL:
+ if (World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
+ {
+ World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
+ if(tile.Code != null)
+ {
+ if (tile.Code.StartsWith("FARRIER-"))
+ {
+ string[] farrierInfo = tile.Code.Split('-');
+ int farrierId = int.Parse(farrierInfo[1]);
+
+ Farrier farrier = Farrier.GetFarrierById(farrierId);
+
+ int totalPrice = 0;
+ foreach (HorseInstance horse in sender.LoggedinUser.HorseInventory.HorseList)
+ {
+ if (horse.BasicStats.Shoes < farrier.SteelShoesAmount)
+ {
+ totalPrice += farrier.SteelCost;
+ }
+ }
+
+ if (sender.LoggedinUser.Money >= totalPrice)
+ {
+ foreach (HorseInstance horse in sender.LoggedinUser.HorseInventory.HorseList)
+ {
+ if (horse.BasicStats.Shoes < farrier.SteelShoesAmount)
+ {
+ horse.BasicStats.Shoes = farrier.SteelShoesAmount;
+ }
+ }
+ sender.LoggedinUser.TakeMoney(totalPrice);
+
+ byte[] messagePacket = PacketBuilder.CreateChat(Messages.FormatFarrierPutOnSteelShoesAllMesssage(farrier.SteelShoesAmount, 1000), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(messagePacket);
+ }
+ else
+ {
+ byte[] cantAffordMessage = PacketBuilder.CreateChat(Messages.FarrierShoesCantAffordMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantAffordMessage);
+ break;
+ }
+ UpdateArea(sender);
+ }
+ }
+
+ }
+ break;
+ case PacketBuilder.HORSE_GROOM_SERVICE:
+ randomId = 0;
+ packetStr = Encoding.UTF8.GetString(packet);
+ randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
+
+ if (randomIdStr == "NaN")
+ break;
+
+ try
+ {
+ randomId = int.Parse(randomIdStr);
+ }
+ catch (Exception)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
+ break;
+ }
+ if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
+ {
+ HorseInstance groomHorseInst = sender.LoggedinUser.HorseInventory.GetHorseById(randomId);
+ sender.LoggedinUser.LastViewedHorse = groomHorseInst;
+
+ if (World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
+ {
+ World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
+ if(tile.Code != null)
+ {
+ if (tile.Code.StartsWith("GROOMER-"))
+ {
+ string[] groomerInfo = tile.Code.Split('-');
+ int groomerId = int.Parse(groomerInfo[1]);
+
+ Groomer groomer = Groomer.GetGroomerById(groomerId);
+ int price = groomer.CalculatePrice(groomHorseInst.BasicStats.Groom);
+
+
+ if (sender.LoggedinUser.Money >= price)
+ {
+ groomHorseInst.BasicStats.Groom = groomer.Max;
+ sender.LoggedinUser.TakeMoney(price);
+
+ byte[] messagePacket = PacketBuilder.CreateChat(Messages.FormatHorseGroomedToBestAbilities(groomHorseInst.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(messagePacket);
+ }
+ else
+ {
+ byte[] cantAffordMessage = PacketBuilder.CreateChat(Messages.GroomerCannotAffordMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantAffordMessage);
+ break;
+ }
+ UpdateArea(sender);
+ }
+
+ }
+ }
+ break;
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to use groomer services on a non existant horse.");
+ break;
+ }
+ case PacketBuilder.HORSE_GROOM_SERVICE_ALL:
+ if (World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
+ {
+ World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
+ if(tile.Code != null)
+ {
+ if (tile.Code.StartsWith("GROOMER-"))
+ {
+ string[] groomerInfo = tile.Code.Split('-');
+ int groomId = int.Parse(groomerInfo[1]);
+ Groomer groomer = Groomer.GetGroomerById(groomId);
+ int price = 0;
+ int count = 0;
+
+ foreach (HorseInstance horse in sender.LoggedinUser.HorseInventory.HorseList)
+ {
+ if (horse.BasicStats.Groom < groomer.Max)
+ {
+ price += groomer.CalculatePrice(horse.BasicStats.Groom);
+ count++;
+ }
+ }
+ if (count == 0)
+ {
+ byte[] notNeededMessagePacket = PacketBuilder.CreateChat(Messages.GroomerDontNeed, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(notNeededMessagePacket);
+ break;
+ }
+ else if (sender.LoggedinUser.Money >= price)
+ {
+ foreach (HorseInstance horse in sender.LoggedinUser.HorseInventory.HorseList)
+ if (horse.BasicStats.Groom < groomer.Max)
+ horse.BasicStats.Groom = groomer.Max;
+
+ byte[] groomedAllHorsesPacket = PacketBuilder.CreateChat(Messages.GroomerBestToHisAbilitiesALL, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(groomedAllHorsesPacket);
+
+ sender.LoggedinUser.TakeMoney(price);
+
+ }
+ else
+ {
+ byte[] cannotAffordMessagePacket = PacketBuilder.CreateChat(Messages.GroomerCannotAffordMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cannotAffordMessagePacket);
+ break;
+ }
+ UpdateArea(sender);
+ }
+
+ }
+ }
+ break;
+ case PacketBuilder.HORSE_BARN_SERVICE:
+ randomId = 0;
+ packetStr = Encoding.UTF8.GetString(packet);
+ randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
+
+ if (randomIdStr == "NaN")
+ break;
+
+ try
+ {
+ randomId = int.Parse(randomIdStr);
+ }
+ catch (Exception)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
+ break;
+ }
+ if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
+ {
+ HorseInstance barnHorseInst = sender.LoggedinUser.HorseInventory.GetHorseById(randomId);
+ sender.LoggedinUser.LastViewedHorse = barnHorseInst;
+
+ if (World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
+ {
+ World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
+ if (tile.Code != null)
+ {
+ if (tile.Code.StartsWith("BARN-"))
+ {
+ string[] barnInfo = tile.Code.Split('-');
+ int barnId = int.Parse(barnInfo[1]);
+
+ Barn barn = Barn.GetBarnById(barnId);
+ int price = barn.CalculatePrice(barnHorseInst.BasicStats.Tiredness, barnHorseInst.BasicStats.Hunger, barnHorseInst.BasicStats.Thirst); ;
+
+
+ if (sender.LoggedinUser.Money >= price)
+ {
+ barnHorseInst.BasicStats.Tiredness = 1000;
+ barnHorseInst.BasicStats.Hunger = 1000;
+ barnHorseInst.BasicStats.Thirst = 1000;
+ sender.LoggedinUser.TakeMoney(price);
+
+ byte[] messagePacket = PacketBuilder.CreateChat(Messages.FormatBarnHorseFullyFed(barnHorseInst.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(messagePacket);
+ }
+ else
+ {
+ byte[] cantAffordMessage = PacketBuilder.CreateChat(Messages.BarnCantAffordService, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantAffordMessage);
+ break;
+ }
+ UpdateArea(sender);
+ }
+
+ }
+ }
+ break;
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to use groomer services on a non existant horse.");
+ break;
+ }
+ case PacketBuilder.HORSE_BARN_SERVICE_ALL:
+ if (World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
+ {
+ World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
+ if(tile.Code != null)
+ {
+ if (tile.Code.StartsWith("BARN-"))
+ {
+ string[] barnInfo = tile.Code.Split('-');
+ int barnId = int.Parse(barnInfo[1]);
+ Barn barn = Barn.GetBarnById(barnId);
+ int totalPrice = 0;
+
+ foreach (HorseInstance horse in sender.LoggedinUser.HorseInventory.HorseList)
+ {
+ int price = barn.CalculatePrice(horse.BasicStats.Tiredness, horse.BasicStats.Hunger, horse.BasicStats.Thirst);
+ if (price > 0)
+ totalPrice += price;
+ }
+ if (totalPrice == 0)
+ {
+ byte[] notNeededMessagePacket = PacketBuilder.CreateChat(Messages.BarnServiceNotNeeded, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(notNeededMessagePacket);
+ break;
+ }
+ else if (sender.LoggedinUser.Money >= totalPrice)
+ {
+ foreach (HorseInstance horse in sender.LoggedinUser.HorseInventory.HorseList)
+ {
+ horse.BasicStats.Tiredness = 1000;
+ horse.BasicStats.Thirst = 1000;
+ horse.BasicStats.Hunger = 1000;
+ }
+
+ byte[] barnedAllHorsesPacket = PacketBuilder.CreateChat(Messages.BarnAllHorsesFullyFed, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(barnedAllHorsesPacket);
+
+ sender.LoggedinUser.TakeMoney(totalPrice);
+
+ }
+ else
+ {
+ byte[] cannotAffordMessagePacket = PacketBuilder.CreateChat(Messages.BarnCantAffordService, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cannotAffordMessagePacket);
+ break;
+ }
+ UpdateArea(sender);
+ }
+
+ }
+ }
+ break;
+ case PacketBuilder.HORSE_TRAIN:
+ randomId = 0;
+ packetStr = Encoding.UTF8.GetString(packet);
+ randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
+
+ if (randomIdStr == "NaN")
+ break;
+
+ try
+ {
+ randomId = int.Parse(randomIdStr);
+ }
+ catch (Exception)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
+ break;
+ }
+ if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
+ {
+ HorseInstance trainHorseInst = sender.LoggedinUser.HorseInventory.GetHorseById(randomId);
+ sender.LoggedinUser.LastViewedHorse = trainHorseInst;
+
+ if (World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
+ {
+ World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
+ if (tile.Code != null)
+ {
+ if (tile.Code.StartsWith("TRAINER-"))
+ {
+ if (trainHorseInst.TrainTimer > 0)
+ {
+ byte[] trainSuccessfulMessage = PacketBuilder.CreateChat(Messages.FormatTrainerCantTrainAgainIn(trainHorseInst.TrainTimer), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(trainSuccessfulMessage);
+ break;
+ }
+ string[] trainerInfo = tile.Code.Split('-');
+ int trainerId = int.Parse(trainerInfo[1]);
+
+ Trainer trainer = Trainer.GetTrainerById(trainerId);
+
+ if (sender.LoggedinUser.Money >= trainer.MoneyCost)
+ {
+ sender.LoggedinUser.TakeMoney(trainer.MoneyCost);
+ trainHorseInst.BasicStats.Mood -= trainer.MoodCost;
+ trainHorseInst.BasicStats.Thirst -= trainer.ThirstCost;
+ trainHorseInst.BasicStats.Hunger -= trainer.HungerCost;
+
+
+ switch (trainer.ImprovesStat.ToUpper())
+ {
+ case "SPEED":
+ trainHorseInst.AdvancedStats.Speed += trainer.ImprovesAmount;
+ break;
+ case "STRENGTH":
+ trainHorseInst.AdvancedStats.Strength += trainer.ImprovesAmount;
+ break;
+ case "AGILITY":
+ trainHorseInst.AdvancedStats.Agility += trainer.ImprovesAmount;
+ break;
+ case "ENDURANCE":
+ trainHorseInst.AdvancedStats.Endurance += trainer.ImprovesAmount;
+ break;
+ case "CONFORMATION":
+ trainHorseInst.AdvancedStats.Conformation += trainer.ImprovesAmount;
+ break;
+ default:
+ trainHorseInst.AdvancedStats.Speed += trainer.ImprovesAmount;
+ break;
+ }
+ trainHorseInst.BasicStats.Experience += trainer.ExperienceGained;
+ if (!sender.LoggedinUser.Subscribed)
+ trainHorseInst.TrainTimer = 1440;
+ else
+ trainHorseInst.TrainTimer = 720;
+
+ byte[] trainSuccessfulMessage = PacketBuilder.CreateChat(Messages.FormatTrainedInStatFormat(trainHorseInst.Name, trainer.ImprovesStat), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(trainSuccessfulMessage);
+
+
+ sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.Training).Count++;
+
+ if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.Training).Count >= 1000)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(26)); // Pro Trainer
+ if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.Training).Count >= 10000)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(53)); // Top Trainer
+
+ UpdateArea(sender);
+ }
+ else
+ {
+ byte[] cantAffordPacket = PacketBuilder.CreateChat(Messages.TrainerCantAfford, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantAffordPacket);
+ }
+
+ }
+
+ }
+ }
+ break;
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to use trauber services on a non existant horse.");
+ break;
+ }
+ case PacketBuilder.HORSE_GIVE_FEED:
+ randomId = 0;
+ packetStr = Encoding.UTF8.GetString(packet);
+ randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
+ try
+ {
+ randomId = int.Parse(randomIdStr);
+
+ }
+ catch (Exception)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
+ break;
+ }
+ if(sender.LoggedinUser.LastViewedHorse == null)
+ {
+ Logger.InfoPrint(sender.LoggedinUser.Username + " Tried to feed a non existant horse.");
+ break;
+ }
+ if (sender.LoggedinUser.Inventory.HasItem(randomId))
+ {
+ InventoryItem item = sender.LoggedinUser.Inventory.GetItemByRandomid(randomId);
+ Item.ItemInformation itemInfo = item.ItemInstances[0].GetItemInfo();
+ HorseInstance horseInstance = sender.LoggedinUser.LastViewedHorse;
+ bool tooMuch = false;
+ bool changePersonality = false;
+ bool changeInteligence = false;
+
+ foreach(Item.Effects effect in itemInfo.Effects)
+ {
+ switch(effect.EffectsWhat)
+ {
+ case "HEALTH":
+ if (horseInstance.BasicStats.Health + effect.EffectAmount > 1000)
+ tooMuch = true;
+ horseInstance.BasicStats.Health += effect.EffectAmount;
+ break;
+ case "HUNGER":
+ if (horseInstance.BasicStats.Hunger + effect.EffectAmount > 1000)
+ tooMuch = true;
+ horseInstance.BasicStats.Hunger += effect.EffectAmount;
+ break;
+ case "MOOD":
+ if (horseInstance.BasicStats.Mood + effect.EffectAmount > 1000)
+ tooMuch = true;
+ horseInstance.BasicStats.Mood += effect.EffectAmount;
+ break;
+ case "GROOM":
+ if (horseInstance.BasicStats.Groom + effect.EffectAmount > 1000)
+ tooMuch = true;
+ horseInstance.BasicStats.Groom += effect.EffectAmount;
+ break;
+ case "SHOES":
+ if (horseInstance.BasicStats.Shoes + effect.EffectAmount > 1000)
+ tooMuch = true;
+ horseInstance.BasicStats.Shoes += effect.EffectAmount;
+ break;
+ case "THIRST":
+ if (horseInstance.BasicStats.Thirst + effect.EffectAmount > 1000)
+ tooMuch = true;
+ horseInstance.BasicStats.Thirst += effect.EffectAmount;
+ break;
+ case "TIREDNESS":
+ if (horseInstance.BasicStats.Tiredness + effect.EffectAmount > 1000)
+ tooMuch = true;
+ horseInstance.BasicStats.Tiredness += effect.EffectAmount;
+ break;
+ case "INTELLIGENCEOFFSET":
+ horseInstance.AdvancedStats.Inteligence += effect.EffectAmount;
+ changeInteligence = true;
+ break;
+ case "PERSONALITYOFFSET":
+ horseInstance.AdvancedStats.Personality += effect.EffectAmount;
+ changePersonality = true;
+
+ break;
+ case "SPOILED":
+ horseInstance.Spoiled += effect.EffectAmount;
+ break;
+ }
+ }
+ sender.LoggedinUser.Inventory.Remove(item.ItemInstances[0]);
+
+ if(changePersonality)
+ {
+ byte[] personalityIncreased = PacketBuilder.CreateChat(Messages.HorseFeedPersonalityIncreased, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(personalityIncreased);
+ }
+ if (changeInteligence)
+ {
+ byte[] inteligenceIncreased = PacketBuilder.CreateChat(Messages.HorseFeedInteligenceIncreased, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(inteligenceIncreased);
+ }
+
+ if(item.ItemId == Item.MagicDroplet)
+ {
+ string oldColor = horseInstance.Color;
+ string newColor = horseInstance.Breed.Colors[RandomNumberGenerator.Next(0, horseInstance.Breed.Colors.Length)];
+
+ horseInstance.Color = newColor;
+ horseInstance.MagicUsed++;
+
+ byte[] magicDropletUsed = PacketBuilder.CreateChat(Messages.FormatHorseFeedMagicDropletUsed(oldColor, newColor), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(magicDropletUsed);
+ }
+
+ if(item.ItemId == Item.MagicBean)
+ {
+ double oldH = HorseInfo.CalculateHands(horseInstance.AdvancedStats.Height, false);
+ int newHeight = RandomNumberGenerator.Next(horseInstance.Breed.BaseStats.MinHeight, horseInstance.Breed.BaseStats.MaxHeight+1);
+ double newH = HorseInfo.CalculateHands(newHeight, false);
+
+ horseInstance.AdvancedStats.Height = newHeight;
+ horseInstance.MagicUsed++;
+
+ byte[] magicBeansUsed = PacketBuilder.CreateChat(Messages.FormatHorseFeedMagicBeanUsed(oldH, newH), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(magicBeansUsed);
+ }
+
+ byte[] horseNeighThanksPacket = PacketBuilder.CreateChat(Messages.HorseNeighsThanks, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(horseNeighThanksPacket);
+
+ if (tooMuch)
+ {
+ byte[] horseCouldntFinishItAll = PacketBuilder.CreateChat(Messages.HorseCouldNotFinish, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(horseCouldntFinishItAll);
+ }
+
+ sender.LoggedinUser.MajorPriority = true;
+ byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildHorseFeedMenu(sender.LoggedinUser.LastViewedHorse, sender.LoggedinUser));
+ sender.SendPacket(metaPacket);
+
+
+ break;
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to feed a non existant item to a horse.");
+ break;
+ }
+ case PacketBuilder.HORSE_ENTER_ARENA:
+ randomId = 0;
+ packetStr = Encoding.UTF8.GetString(packet);
+ randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
+ try
+ {
+ randomId = int.Parse(randomIdStr);
+
+ }
+ catch (Exception)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
+ break;
+ }
+ if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
+ {
+ HorseInstance horseInstance = sender.LoggedinUser.HorseInventory.GetHorseById(randomId);
+ if(World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
+ {
+ World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
+ if(tile.Code != null)
+ {
+ if (tile.Code.StartsWith("ARENA-"))
+ {
+ string[] arenaInfo = tile.Code.Split('-');
+ int arenaId = int.Parse(arenaInfo[1]);
+ Arena arena = Arena.GetAreaById(arenaId);
+ if (!Arena.UserHasEnteredHorseInAnyArena(sender.LoggedinUser))
+ {
+ if (horseInstance.BasicStats.Thirst <= 200)
+ {
+ byte[] tooThirsty = PacketBuilder.CreateChat(Messages.ArenaTooThirsty, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(tooThirsty);
+ break;
+ }
+ else if (horseInstance.BasicStats.Hunger <= 200)
+ {
+ byte[] tooHungry = PacketBuilder.CreateChat(Messages.ArenaTooHungry, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(tooHungry);
+ break;
+ }
+ else if (horseInstance.BasicStats.Shoes <= 200)
+ {
+ byte[] needsFarrier = PacketBuilder.CreateChat(Messages.ArenaNeedsFarrier, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(needsFarrier);
+ break;
+ }
+ else if (horseInstance.BasicStats.Tiredness <= 200)
+ {
+ byte[] tooTired = PacketBuilder.CreateChat(Messages.ArenaTooTired, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(tooTired);
+ break;
+ }
+ else if (horseInstance.BasicStats.Health <= 200)
+ {
+ byte[] needsVet = PacketBuilder.CreateChat(Messages.ArenaNeedsVet, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(needsVet);
+ break;
+ }
+
+
+
+ if (sender.LoggedinUser.Money >= arena.EntryCost)
+ {
+ arena.AddEntry(sender.LoggedinUser, horseInstance);
+ break;
+ }
+ else
+ {
+ byte[] cantAffordEntryFee = PacketBuilder.CreateChat(Messages.ArenaCantAfford, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantAffordEntryFee);
+ break;
+ }
+ }
+ else
+ {
+ byte[] allreadyEntered = PacketBuilder.CreateChat(Messages.ArenaAlreadyEntered, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(allreadyEntered);
+ }
+ }
+
+ }
+ }
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to enter a non existant horse into a competition.");
+ break;
+ }
+ break;
+ case PacketBuilder.HORSE_RELEASE:
+ randomId = 0;
+ packetStr = Encoding.UTF8.GetString(packet);
+ randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
+ try
+ {
+ randomId = int.Parse(randomIdStr);
+
+ }
+ catch (Exception)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
+ break;
+ }
+ if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
+ {
+ if(World.InTown(sender.LoggedinUser.X, sender.LoggedinUser.Y))
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to reelease a horse while inside a town....");
+ break;
+ }
+
+
+ HorseInstance horseReleaseInst = sender.LoggedinUser.HorseInventory.GetHorseById(randomId);
+ if(sender.LoggedinUser.CurrentlyRidingHorse != null)
+ {
+ if(horseReleaseInst.RandomId == sender.LoggedinUser.CurrentlyRidingHorse.RandomId)
+ {
+ byte[] errorChatPacket = PacketBuilder.CreateChat(Messages.HorseCantReleaseTheHorseYourRidingOn, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(errorChatPacket);
+ break;
+ }
+
+ }
+
+ if (horseReleaseInst.Description == "")
+ horseReleaseInst.Description += Messages.FormatHorseReleasedBy(sender.LoggedinUser.Username);
+
+ Logger.InfoPrint(sender.LoggedinUser.Username + " RELEASED HORSE: " + horseReleaseInst.Name + " (a " + horseReleaseInst.Breed.Name + ").");
+
+ sender.LoggedinUser.HorseInventory.DeleteHorse(horseReleaseInst);
+ new WildHorse(horseReleaseInst, sender.LoggedinUser.X, sender.LoggedinUser.Y, 60, true);
+
+ sender.LoggedinUser.LastViewedHorse = horseReleaseInst;
+ sender.LoggedinUser.MajorPriority = true;
+ byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildHorseReleased());
+ sender.SendPacket(metaPacket);
+ break;
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to release at a non existant horse.");
+ break;
+ }
+ case PacketBuilder.HORSE_TACK:
+ randomId = 0;
+ packetStr = Encoding.UTF8.GetString(packet);
+ randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
+ try
+ {
+ randomId = int.Parse(randomIdStr);
+
+ }
+ catch (Exception)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
+ break;
+ }
+ if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
+ {
+ HorseInstance horseTackInst = sender.LoggedinUser.HorseInventory.GetHorseById(randomId);
+
+ sender.LoggedinUser.LastViewedHorse = horseTackInst;
+ sender.LoggedinUser.MajorPriority = true;
+ byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildTackMenu(horseTackInst, sender.LoggedinUser));
+ sender.SendPacket(metaPacket);
+ break;
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to tack at a non existant horse.");
+ break;
+ }
+ case PacketBuilder.HORSE_DRINK:
+ if(World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
+ {
+ World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
+ if(tile.Code != "POND")
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to drink from a pond when not on one.");
+ break;
+ }
+ }
+
+ randomId = 0;
+ packetStr = Encoding.UTF8.GetString(packet);
+ randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
+ try
+ {
+ randomId = int.Parse(randomIdStr);
+
+ }
+ catch (Exception)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
+ break;
+ }
+ if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
+ {
+ HorseInstance horseDrinkInst = sender.LoggedinUser.HorseInventory.GetHorseById(randomId);
+
+ if(horseDrinkInst.BasicStats.Health < 200)
+ {
+ byte[] hpToLow = PacketBuilder.CreateChat(Messages.FormatPondHpLowMessage(horseDrinkInst.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(hpToLow);
+ break;
+ }
+
+ if(horseDrinkInst.BasicStats.Thirst < 1000)
+ {
+ horseDrinkInst.BasicStats.Thirst = 1000;
+ byte[] drinkFull = PacketBuilder.CreateChat(Messages.FormatPondDrinkFull(horseDrinkInst.Name),PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(drinkFull);
+
+ if(RandomNumberGenerator.Next(0, 100) < 25)
+ {
+ horseDrinkInst.BasicStats.Health -= 200;
+ byte[] ohNoes = PacketBuilder.CreateChat(Messages.FormatPondDrinkOhNoes(horseDrinkInst.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(ohNoes);
+ }
+
+ UpdateArea(sender);
+ }
+ else
+ {
+ byte[] notThirsty = PacketBuilder.CreateChat(Messages.FormatPondNotThirsty(horseDrinkInst.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(notThirsty);
+ break;
+ }
+ break;
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to tack at a non existant horse.");
+ break;
+ }
+ case PacketBuilder.HORSE_TACK_EQUIP:
+
+ int itemId = 0;
+ packetStr = Encoding.UTF8.GetString(packet);
+ string itemIdStr = packetStr.Substring(2, packetStr.Length - 4);
+ try
+ {
+ itemId = int.Parse(itemIdStr);
+ }
+ catch (Exception)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
+ break;
+ }
+ if(Item.ItemIdExist(itemId))
+ {
+ if(sender.LoggedinUser.LastViewedHorse != null)
+ {
+ if(sender.LoggedinUser.LastViewedHorse.AutoSell > 0)
+ {
+ byte[] failMessagePacket = PacketBuilder.CreateChat(Messages.HorseTackFailAutoSell, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(failMessagePacket);
+ break;
+ }
+
+ if(sender.LoggedinUser.Inventory.HasItemId(itemId))
+ {
+ Item.ItemInformation itemInfo = Item.GetItemById(itemId);
+ if (itemInfo.Type == "TACK")
+ {
+ switch (itemInfo.GetMiscFlag(0))
+ {
+ case 1: // Saddle
+ if(sender.LoggedinUser.LastViewedHorse.Equipment.Saddle != null)
+ sender.LoggedinUser.Inventory.AddIgnoringFull(new ItemInstance(sender.LoggedinUser.LastViewedHorse.Equipment.Saddle.Id));
+ Database.SetSaddle(sender.LoggedinUser.LastViewedHorse.RandomId, itemInfo.Id);
+ sender.LoggedinUser.LastViewedHorse.Equipment.Saddle = itemInfo;
+ break;
+ case 2: // Saddle Pad
+ if (sender.LoggedinUser.LastViewedHorse.Equipment.SaddlePad != null)
+ sender.LoggedinUser.Inventory.AddIgnoringFull(new ItemInstance(sender.LoggedinUser.LastViewedHorse.Equipment.SaddlePad.Id));
+ Database.SetSaddlePad(sender.LoggedinUser.LastViewedHorse.RandomId, itemInfo.Id);
+ sender.LoggedinUser.LastViewedHorse.Equipment.SaddlePad = itemInfo;
+ break;
+ case 3: // Bridle
+ if (sender.LoggedinUser.LastViewedHorse.Equipment.Bridle != null)
+ sender.LoggedinUser.Inventory.AddIgnoringFull(new ItemInstance(sender.LoggedinUser.LastViewedHorse.Equipment.Bridle.Id));
+ Database.SetBridle(sender.LoggedinUser.LastViewedHorse.RandomId, itemInfo.Id);
+ sender.LoggedinUser.LastViewedHorse.Equipment.Bridle = itemInfo;
+ break;
+ }
+
+
+ sender.LoggedinUser.Inventory.Remove(sender.LoggedinUser.Inventory.GetItemByItemId(itemId).ItemInstances[0]); // Remove item from inventory.
+
+ sender.LoggedinUser.MajorPriority = true;
+ byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildTackMenu(sender.LoggedinUser.LastViewedHorse, sender.LoggedinUser));
+ sender.SendPacket(metaPacket);
+
+ byte[] equipMsgPacket = PacketBuilder.CreateChat(Messages.FormatEquipTackMessage(itemInfo.Name, sender.LoggedinUser.LastViewedHorse.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(equipMsgPacket);
+
+ }
+ else if(itemInfo.Type == "COMPANION")
+ {
+ if (sender.LoggedinUser.LastViewedHorse.Equipment.Companion != null)
+ sender.LoggedinUser.Inventory.AddIgnoringFull(new ItemInstance(sender.LoggedinUser.LastViewedHorse.Equipment.Companion.Id));
+ Database.SetCompanion(sender.LoggedinUser.LastViewedHorse.RandomId, itemInfo.Id);
+ sender.LoggedinUser.LastViewedHorse.Equipment.Companion = itemInfo;
+
+ sender.LoggedinUser.Inventory.Remove(sender.LoggedinUser.Inventory.GetItemByItemId(itemId).ItemInstances[0]); // Remove item from inventory.
+
+ sender.LoggedinUser.MajorPriority = true;
+ byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildHorseCompanionEquipMenu(sender.LoggedinUser.LastViewedHorse, sender.LoggedinUser));
+ sender.SendPacket(metaPacket);
+
+ byte[] equipMsgPacket = PacketBuilder.CreateChat(Messages.FormatHorseCompanionEquipMessage(sender.LoggedinUser.LastViewedHorse.Name, itemInfo.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(equipMsgPacket);
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to equip a tack item to a hrose but that item was not of type \"TACK\".");
+ }
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " tried to equip tack he doesnt have");
+ break;
+ }
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to equip tack to a horse when not viewing one.");
+ break;
+ }
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " tried to equip tack he doesnt exist");
+ break;
+ }
+
+ break;
+ case PacketBuilder.HORSE_TACK_UNEQUIP:
+ if (sender.LoggedinUser.LastViewedHorse != null)
+ {
+ byte equipSlot = packet[2];
+ switch(equipSlot)
+ {
+ case 0x31: // Saddle
+ if (sender.LoggedinUser.LastViewedHorse.Equipment.Saddle != null)
+ sender.LoggedinUser.Inventory.AddIgnoringFull(new ItemInstance(sender.LoggedinUser.LastViewedHorse.Equipment.Saddle.Id));
+ Database.ClearSaddle(sender.LoggedinUser.LastViewedHorse.RandomId);
+ sender.LoggedinUser.LastViewedHorse.Equipment.Saddle = null;
+ break;
+ case 0x32: // Saddle Pad
+ if (sender.LoggedinUser.LastViewedHorse.Equipment.SaddlePad != null)
+ sender.LoggedinUser.Inventory.AddIgnoringFull(new ItemInstance(sender.LoggedinUser.LastViewedHorse.Equipment.SaddlePad.Id));
+ Database.ClearSaddlePad(sender.LoggedinUser.LastViewedHorse.RandomId);
+ sender.LoggedinUser.LastViewedHorse.Equipment.SaddlePad = null;
+ break;
+ case 0x33: // Bridle
+ if (sender.LoggedinUser.LastViewedHorse.Equipment.Bridle != null)
+ sender.LoggedinUser.Inventory.AddIgnoringFull(new ItemInstance(sender.LoggedinUser.LastViewedHorse.Equipment.Bridle.Id));
+ Database.ClearBridle(sender.LoggedinUser.LastViewedHorse.RandomId);
+ sender.LoggedinUser.LastViewedHorse.Equipment.Bridle = null;
+ break;
+ case 0x34: // Companion
+ if (sender.LoggedinUser.LastViewedHorse.Equipment.Companion != null)
+ sender.LoggedinUser.Inventory.AddIgnoringFull(new ItemInstance(sender.LoggedinUser.LastViewedHorse.Equipment.Companion.Id));
+ Database.ClearCompanion(sender.LoggedinUser.LastViewedHorse.RandomId);
+ sender.LoggedinUser.LastViewedHorse.Equipment.Companion = null;
+ goto companionRemove;
+ default:
+ Logger.ErrorPrint("Unknown equip slot: " + equipSlot.ToString("X"));
+ break;
+ }
+ byte[] itemUnequipedMessage = PacketBuilder.CreateChat(Messages.FormatUnEquipTackMessage(sender.LoggedinUser.LastViewedHorse.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(itemUnequipedMessage);
+
+ if(sender.LoggedinUser.CurrentlyRidingHorse != null)
+ {
+ if(sender.LoggedinUser.CurrentlyRidingHorse.RandomId == sender.LoggedinUser.LastViewedHorse.RandomId)
+ {
+ byte[] disMounted = PacketBuilder.CreateChat(Messages.FormatHorseDismountedBecauseTackedMessage(sender.LoggedinUser.CurrentlyRidingHorse.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.LoggedinUser.Facing %= 5;
+ sender.LoggedinUser.CurrentlyRidingHorse = null;
+ sender.SendPacket(disMounted);
+ }
+ }
+
+ sender.LoggedinUser.MajorPriority = true;
+ byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildTackMenu(sender.LoggedinUser.LastViewedHorse, sender.LoggedinUser));
+ sender.SendPacket(metaPacket);
+ break;
+ companionRemove:;
+ itemUnequipedMessage = PacketBuilder.CreateChat(Messages.FormatHorseCompanionRemoveMessage(sender.LoggedinUser.LastViewedHorse.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(itemUnequipedMessage);
+
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildHorseCompanionEquipMenu(sender.LoggedinUser.LastViewedHorse, sender.LoggedinUser));
+ sender.SendPacket(metaPacket);
+ break;
+
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to unequip items from non existnat horse");
+ }
+ break;
+ case PacketBuilder.HORSE_DISMOUNT:
+ randomId = 0;
+ packetStr = Encoding.UTF8.GetString(packet);
+ randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
+
+ if(randomIdStr == "") // F7 Shortcut
+ {
+ if(sender.LoggedinUser.CurrentlyRidingHorse != null)
+ {
+
+ byte[] stopRidingHorseMessagePacket = PacketBuilder.CreateChat(Messages.HorseStopRidingMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(stopRidingHorseMessagePacket);
+
+ StopRidingHorse(sender);
+ }
+ else
+ {
+ if(sender.LoggedinUser.HorseInventory.HorseIdExist(sender.LoggedinUser.LastRiddenHorse))
+ StartRidingHorse(sender, sender.LoggedinUser.LastRiddenHorse);
+ }
+ break;
+ }
+
+ try
+ {
+ randomId = int.Parse(randomIdStr);
+
+ }
+ catch (Exception)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
+ break;
+ }
+ if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
+ {
+
+ byte[] stopRidingHorseMessagePacket = PacketBuilder.CreateChat(Messages.HorseStopRidingMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(stopRidingHorseMessagePacket);
+
+ StopRidingHorse(sender);
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to dismount at a non existant horse.");
+ break;
+ }
+ break;
+ case PacketBuilder.HORSE_MOUNT:
+ randomId = 0;
+ packetStr = Encoding.UTF8.GetString(packet);
+ randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
+ try
+ {
+ randomId = int.Parse(randomIdStr);
+
+ }
+ catch (Exception)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
+ break;
+ }
+ if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
+ {
+ StartRidingHorse(sender, randomId);
+ break;
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to mount at a non existant horse.");
+ break;
+ }
+ case PacketBuilder.HORSE_LOOK:
+ randomId = 0;
+ packetStr = Encoding.UTF8.GetString(packet);
+ randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
+ HorseInstance horseInst;
+ try
+ {
+ randomId = int.Parse(randomIdStr);
+
+ }
+ catch (Exception)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
+ return;
+ }
+ if(sender.LoggedinUser.HorseInventory.HorseIdExist(randomId))
+ {
+ horseInst = sender.LoggedinUser.HorseInventory.GetHorseById(randomId);
+ UpdateHorseMenu(sender, horseInst);
+ }
+ else
+ {
+ try
+ { // Not your horse? possibly viewed inside a ranch?
+ horseInst = Database.GetPlayerHorse(randomId);
+ UpdateHorseMenu(sender, horseInst);
+ break;
+ }
+ catch(Exception)
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to look at a non existant horse.");
+ break;
+ }
+ }
+
+ break;
+ case PacketBuilder.HORSE_ESCAPE:
+ if(WildHorse.DoesHorseExist(sender.LoggedinUser.CapturingHorseId))
+ {
+ WildHorse capturing = WildHorse.GetHorseById(sender.LoggedinUser.CapturingHorseId);
+ sender.LoggedinUser.CapturingHorseId = 0;
+
+ if (capturing.X == sender.LoggedinUser.X && capturing.Y == sender.LoggedinUser.Y)
+ {
+ capturing.Escape();
+ Logger.InfoPrint(sender.LoggedinUser.Username + " Failed to capture: " + capturing.Instance.Breed.Name + " new location: " + capturing.X + ", " + capturing.Y);
+
+ }
+ }
+ sender.LoggedinUser.MajorPriority = true;
+ byte[] hoseEscaped = PacketBuilder.CreateMetaPacket(Meta.BuildHorseEscapedMessage());
+ sender.SendPacket(hoseEscaped);
+ break;
+ case PacketBuilder.HORSE_CAUGHT:
+ if (WildHorse.DoesHorseExist(sender.LoggedinUser.CapturingHorseId))
+ {
+ WildHorse capturing = WildHorse.GetHorseById(sender.LoggedinUser.CapturingHorseId);
+ sender.LoggedinUser.CapturingHorseId = 0;
+
+ if (capturing.X == sender.LoggedinUser.X && capturing.Y == sender.LoggedinUser.Y)
+ {
+ try
+ {
+ capturing.Capture(sender.LoggedinUser);
+ }
+ catch (InventoryFullException)
+ {
+ byte[] chatMsg = PacketBuilder.CreateChat(Messages.TooManyHorses, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatMsg);
+ break;
+ }
+
+ sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.HorseCapture).Count++;
+
+ if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.HorseCapture).Count >= 100)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(24)); // Wrangler
+ if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.HorseCapture).Count >= 1000)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(25)); // Pro Wrangler
+
+ Logger.InfoPrint(sender.LoggedinUser.Username + " Captured a: " + capturing.Instance.Breed.Name);
+
+ sender.LoggedinUser.MajorPriority = true;
+ byte[] horseCaught = PacketBuilder.CreateMetaPacket(Meta.BuildHorseCaughtMessage());
+ sender.SendPacket(horseCaught);
+
+ break;
+ }
+ }
+ sender.LoggedinUser.MajorPriority = true;
+ byte[] horseAllreadyCaught = PacketBuilder.CreateMetaPacket(Meta.BuildHorseEscapedAnyway());
+ sender.SendPacket(horseAllreadyCaught);
+ break;
+ case PacketBuilder.HORSE_TRY_CAPTURE:
+ randomId = 0;
+ packetStr = Encoding.UTF8.GetString(packet);
+ randomIdStr = packetStr.Substring(2, packetStr.Length - 4);
+ try
+ {
+ randomId = int.Parse(randomIdStr);
+
+ }
+ catch (Exception)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet ");
+ return;
+ }
+ if (!WildHorse.DoesHorseExist(randomId))
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to catch a horse that doesnt exist.");
+ return;
+ }
+
+ if(sender.LoggedinUser.HorseInventory.HorseList.Length >= sender.LoggedinUser.MaxHorses)
+ {
+ byte[] caughtTooManyHorses = PacketBuilder.CreateChat(Messages.HorseCatchTooManyHorsesMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(caughtTooManyHorses);
+ return;
+ }
+
+ sender.LoggedinUser.CapturingHorseId = randomId;
+ byte[] chatPacket = PacketBuilder.CreateChat(Messages.HorseCaptureTimer, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatPacket);
+ byte[] swfModulePacket = PacketBuilder.CreateSwfModulePacket("catchhorse", PacketBuilder.PACKET_SWF_MODULE_FORCE);
+ sender.SendPacket(swfModulePacket);
+
+ break;
+ default:
+ Logger.DebugPrint("Unknown horse packet: " + BitConverter.ToString(packet).Replace("-", " "));
+ break;
+ }
+ }
+
+ public static void OnDynamicInputReceived(GameClient sender, byte[] packet)
+ {
+ if (!sender.LoggedIn)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " Sent dyamic input when not logged in.");
+ return;
+ }
+ string packetStr = Encoding.UTF8.GetString(packet);
+ string dynamicInputStr = packetStr.Substring(1, packetStr.Length - 3);
+ if(dynamicInputStr.Contains("|"))
+ {
+ string[] dynamicInput = dynamicInputStr.Split('|');
+ if(dynamicInput.Length >= 1)
+ {
+ int inputId = 0;
+ try
+ {
+ inputId = int.Parse(dynamicInput[0]);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input ");
+ return;
+ }
+
+ switch(inputId)
+ {
+ case 1: // Bank
+ if (dynamicInput.Length >= 2)
+ {
+ Int64 moneyDeposited = 0;
+ Int64 moneyWithdrawn = 0;
+ try
+ {
+ moneyDeposited = Int64.Parse(dynamicInput[1]);
+ moneyWithdrawn = Int64.Parse(dynamicInput[2]);
+ }
+ catch (Exception)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to deposit/witthdraw NaN money....");
+ UpdateArea(sender);
+ break;
+ }
+
+ // Check if trying to deposit more than can be held in the bank.
+
+ if (Convert.ToInt64(sender.LoggedinUser.BankMoney) + moneyDeposited > 9999999999)
+ {
+ byte[] chatPacket = PacketBuilder.CreateChat(Messages.BankCantHoldThisMuch, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatPacket);
+ UpdateArea(sender);
+ break;
+ }
+
+ // Check if trying to deposit more than 2.1B
+
+ if (moneyWithdrawn > 2100000000)
+ {
+ byte[] chatPacket = PacketBuilder.CreateChat(Messages.BankYouCantHoldThisMuch, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatPacket);
+ UpdateArea(sender);
+ break;
+ }
+
+
+
+ if((moneyDeposited <= sender.LoggedinUser.Money) && moneyDeposited != 0)
+ {
+ sender.LoggedinUser.TakeMoney(Convert.ToInt32(moneyDeposited));
+ sender.LoggedinUser.BankMoney += moneyDeposited;
+
+ byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatDepositedMoneyMessage(Convert.ToInt32(moneyDeposited)), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatPacket);
+ }
+
+ if ((moneyWithdrawn <= sender.LoggedinUser.BankMoney) && moneyWithdrawn != 0)
+ {
+ sender.LoggedinUser.BankMoney -= moneyWithdrawn;
+ sender.LoggedinUser.AddMoney(Convert.ToInt32(moneyWithdrawn));
+
+ byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatWithdrawMoneyMessage(Convert.ToInt32(moneyWithdrawn)), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatPacket);
+ }
+
+ UpdateArea(sender);
+ break;
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (private notes, wrong size)");
+ break;
+ }
+ case 2: // Send Mail
+ if(dynamicInput.Length >= 4)
+ {
+ string to = dynamicInput[1];
+ string subject = dynamicInput[2];
+ string message = dynamicInput[3];
+
+ if(sender.LoggedinUser.Money >= 3)
+ {
+ if(Database.CheckUserExist(to))
+ {
+ int playerId = Database.GetUserid(to);
+
+ sender.LoggedinUser.TakeMoney(3);
+ Mailbox.Mail mailMessage = new Mailbox.Mail();
+ mailMessage.RandomId = RandomID.NextRandomId();
+ mailMessage.FromUser = sender.LoggedinUser.Id;
+ mailMessage.ToUser = playerId;
+ mailMessage.Timestamp = Convert.ToInt32((DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds);
+ mailMessage.Read = false;
+ mailMessage.Subject = subject;
+ mailMessage.Message = message;
+
+ if(IsUserOnline(playerId))
+ {
+ User user = GetUserById(playerId);
+ user.MailBox.AddMail(mailMessage);
+
+ byte[] BaseStatsPacketData = PacketBuilder.CreatePlayerData(user.Money, GameServer.GetNumberOfPlayers(), user.MailBox.UnreadMailCount);
+ user.LoggedinClient.SendPacket(BaseStatsPacketData);
+ }
+ else
+ {
+ Database.AddMail(mailMessage.RandomId, mailMessage.ToUser, mailMessage.FromUser, mailMessage.Subject, mailMessage.Message, mailMessage.Timestamp, mailMessage.Read);
+ }
+
+ byte[] mailMessageSent = PacketBuilder.CreateChat(Messages.FormatCityHallSendMailMessage(to.ToLower()),PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(mailMessageSent);
+
+ UpdateArea(sender);
+ }
+ else
+ {
+ byte[] userDontExistFormat = PacketBuilder.CreateChat(Messages.FormatCityHallCantFindPlayerMessage(to), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(userDontExistFormat);
+ }
+ }
+
+ }
+ break;
+ case 3: // Add Item or Money to Trade
+ {
+ if (dynamicInput.Length >= 2)
+ {
+ if(sender.LoggedinUser.AttemptingToOfferItem == -1) // Money
+ {
+ string answer = dynamicInput[1];
+ int amountMoney = -1;
+ try
+ {
+ amountMoney = int.Parse(answer);
+ }
+ catch (Exception)
+ {
+ byte[] tooMuchMoney = PacketBuilder.CreateChat(Messages.TradeMoneyOfferTooMuch, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(tooMuchMoney);
+ break;
+ }
+ if(amountMoney < 0)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to trade less than 0$");
+ }
+ if(amountMoney >= sender.LoggedinUser.Money)
+ {
+ byte[] tooMuchMoney = PacketBuilder.CreateChat(Messages.TradeMoneyOfferTooMuch, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(tooMuchMoney);
+ break;
+ }
+
+ sender.LoggedinUser.TradingWith.MoneyOffered = amountMoney;
+
+ UpdateArea(sender);
+ if(sender.LoggedinUser.TradingWith != null)
+ if (!sender.LoggedinUser.TradingWith.OtherTrade.Trader.TradeMenuPriority)
+ UpdateArea(sender.LoggedinUser.TradingWith.OtherTrade.Trader.LoggedinClient);
+ break;
+ }
+
+
+
+ if (Item.ItemIdExist(sender.LoggedinUser.AttemptingToOfferItem))
+ {
+ string answer = dynamicInput[1];
+ int itemCount = -1;
+ try
+ {
+ itemCount = int.Parse(answer);
+ }
+ catch(FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (Item TRADE, id is NaN)");
+ }
+
+ InventoryItem item = sender.LoggedinUser.Inventory.GetItemByItemId(sender.LoggedinUser.AttemptingToOfferItem);
+
+ if (itemCount <= 0)
+ {
+ byte[] MustBeAtleast1 = PacketBuilder.CreateChat(Messages.TradeItemOfferAtleast1, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(MustBeAtleast1);
+ break;
+ }
+ if(itemCount > item.ItemInstances.Length)
+ {
+ byte[] TooMuchItems = PacketBuilder.CreateChat(Messages.FormatTradeItemOfferTooMuch(item.ItemInstances.Length, itemCount), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(TooMuchItems);
+ break;
+ }
+
+ foreach(ItemInstance[] existingItems in sender.LoggedinUser.TradingWith.ItemsOffered)
+ {
+ if(existingItems[0].ItemId == sender.LoggedinUser.AttemptingToOfferItem)
+ {
+ sender.LoggedinUser.TradingWith.RemoveOfferedItems(existingItems);
+ break;
+ }
+ }
+
+
+
+ ItemInstance[] items = new ItemInstance[itemCount];
+ for (int i = 0; i < itemCount; i++)
+ {
+ items[i] = item.ItemInstances[i];
+ }
+ sender.LoggedinUser.TradingWith.OfferItems(items);
+
+ UpdateArea(sender);
+ if (sender.LoggedinUser.TradingWith != null)
+ if (!sender.LoggedinUser.TradingWith.OtherTrade.Trader.TradeMenuPriority)
+ UpdateArea(sender.LoggedinUser.TradingWith.OtherTrade.Trader.LoggedinClient);
+ }
+ break;
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (Item TRADE, wrong size)");
+ break;
+ }
+ }
+ case 6: // Riddle Room
+ if (dynamicInput.Length >= 2)
+ {
+ if (sender.LoggedinUser.LastRiddle != null)
+ {
+ string answer = dynamicInput[1];
+ if(sender.LoggedinUser.LastRiddle.CheckAnswer(sender.LoggedinUser, answer))
+ sender.LoggedinUser.LastRiddle = null;
+ UpdateArea(sender);
+ }
+ break;
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (LastRiddle, wrong size)");
+ break;
+ }
+ case 5: // Horse Description
+ if (dynamicInput.Length >= 3)
+ {
+ if(sender.LoggedinUser.LastViewedHorse != null)
+ {
+ string desc = dynamicInput[2];
+ string name = dynamicInput[1];
+ name.Trim();
+ desc.Trim();
+
+ if(name.Length > 50)
+ {
+ byte[] horseNameTooLongPacket = PacketBuilder.CreateChat(Messages.HorseNameTooLongError, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(horseNameTooLongPacket);
+ break;
+ }
+
+ if (desc.Length > 250)
+ {
+ byte[] horseNameTooLongPacket = PacketBuilder.CreateChat(Messages.HorseNameTooLongError, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(horseNameTooLongPacket);
+ break;
+ }
+
+ object filterReason = Chat.FilterMessage(name);
+ if (filterReason != null)
+ {
+ byte[] msg = PacketBuilder.CreateChat(Messages.HorseNameViolationsError, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(msg);
+ return;
+ }
+
+ filterReason = Chat.FilterMessage(desc);
+ if (filterReason != null)
+ {
+ Chat.Reason reason = (Chat.Reason)filterReason;
+ byte[] msg = PacketBuilder.CreateChat(Messages.FormatHorseProfileBlocked(reason.Message), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(msg);
+ return;
+ }
+
+ sender.LoggedinUser.MajorPriority = true;
+ sender.LoggedinUser.LastViewedHorse.Name = dynamicInput[1];
+ sender.LoggedinUser.LastViewedHorse.Description = dynamicInput[2];
+ byte[] horseProfileSavedPacket = PacketBuilder.CreateChat(Messages.FormatHorseSavedProfileMessage(sender.LoggedinUser.LastViewedHorse.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(horseProfileSavedPacket);
+ UpdateHorseMenu(sender, sender.LoggedinUser.LastViewedHorse);
+ }
+ break;
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (NPC Search, wrong size)");
+ break;
+ }
+ case 4: // NPC Search
+ if(dynamicInput.Length >= 2)
+ {
+ sender.LoggedinUser.MajorPriority = true;
+ string metaWindow = Meta.BuildNpcSearch(dynamicInput[1]);
+ byte[] metaPacket = PacketBuilder.CreateMetaPacket(metaWindow);
+ sender.SendPacket(metaPacket);
+ break;
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (NPC Search, wrong size)");
+ break;
+ }
+ case 7: // Private Notes
+ if (dynamicInput.Length >= 2)
+ {
+ sender.LoggedinUser.PrivateNotes = dynamicInput[1];
+ UpdateStats(sender);
+ byte[] chatPacket = PacketBuilder.CreateChat(Messages.PrivateNotesSavedMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatPacket);
+ break;
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (private notes, wrong size)");
+ break;
+ }
+ case 10: // Change auto sell price
+ if (dynamicInput.Length >= 2)
+ {
+ if (sender.LoggedinUser.LastViewedHorse != null)
+ {
+ sender.LoggedinUser.MajorPriority = true;
+ HorseInstance horseInstance = sender.LoggedinUser.LastViewedHorse;
+ int newSellPrice = 0;
+ try
+ {
+ newSellPrice = int.Parse(dynamicInput[1]);
+ }
+ catch (Exception)
+ {
+ newSellPrice = 2147483647; // too high
+ }
+
+ if(newSellPrice > 500000000 || newSellPrice < 0)
+ {
+ byte[] priceTooHigh = PacketBuilder.CreateChat(Messages.HorseAutoSellValueTooHigh, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(priceTooHigh);
+ break;
+ }
+ byte[] sellPricePacket;
+ if (newSellPrice > 0)
+ sellPricePacket = PacketBuilder.CreateChat(Messages.FormatAutoSellConfirmedMessage(newSellPrice), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ else
+ sellPricePacket = PacketBuilder.CreateChat(Messages.HorseAutoSellRemoved, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(sellPricePacket);
+ horseInstance.AutoSell = newSellPrice;
+
+ UpdateHorseMenu(sender, sender.LoggedinUser.LastViewedHorse);
+ }
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (autosell, wrong size)");
+ break;
+ }
+ break;
+ case 11: // Ranch Description Edit
+ if (dynamicInput.Length >= 2)
+ {
+ string title = dynamicInput[1];
+ string desc = dynamicInput[2];
+ if(sender.LoggedinUser.OwnedRanch != null)
+ {
+ title.Trim();
+ desc.Trim();
+ if(title.Length > 100)
+ {
+ byte[] tooLongPacket = PacketBuilder.CreateChat(Messages.RanchSavedTitleTooLongError, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(tooLongPacket);
+ break;
+ }
+ if (desc.Length > 4000)
+ {
+ byte[] tooLongPacket = PacketBuilder.CreateChat(Messages.RanchSavedTitleTooLongError, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(tooLongPacket);
+ break;
+ }
+
+ object filterReason = Chat.FilterMessage(title);
+ if (filterReason != null)
+ {
+ byte[] msg = PacketBuilder.CreateChat(Messages.RanchSavedTitleViolationsError, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(msg);
+ return;
+ }
+
+ filterReason = Chat.FilterMessage(desc);
+ if (filterReason != null)
+ {
+ Chat.Reason reason = (Chat.Reason)filterReason;
+ byte[] msg = PacketBuilder.CreateChat(Messages.FormatRanchDesriptionBlocked(reason.Message), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(msg);
+ return;
+ }
+
+
+ sender.LoggedinUser.OwnedRanch.Title = title;
+ sender.LoggedinUser.OwnedRanch.Description = desc;
+ }
+ byte[] descriptionEditedMessage = PacketBuilder.CreateChat(Messages.RanchSavedRanchDescripton, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(descriptionEditedMessage);
+
+ /*
+ * Pinto bug: Saving ranch description will take you to the STATS menu
+ * instead of just back to your ranch.
+ */
+
+ if (ConfigReader.FixOfficalBugs)
+ UpdateArea(sender);
+ else
+ UpdateStats(sender);
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (ranch description, wrong size)");
+ break;
+ }
+ break;
+ case 12: // Abuse Report
+ if (dynamicInput.Length >= 2)
+ {
+ string userName = dynamicInput[1];
+ string reason = dynamicInput[2];
+ if(Database.CheckUserExist(userName))
+ {
+ if(reason == "")
+ {
+ byte[] validReasonPlz = PacketBuilder.CreateChat(Messages.AbuseReportProvideValidReason, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(validReasonPlz);
+ break;
+ }
+
+ Database.AddReport(sender.LoggedinUser.Username, userName, reason);
+ byte[] chatPacket = PacketBuilder.CreateChat(Messages.AbuseReportFiled, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatPacket);
+ UpdateArea(sender);
+ break;
+ }
+ else
+ {
+ byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAbuseReportPlayerNotFound(userName), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatPacket);
+ break;
+ }
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (private notes, wrong size)");
+ break;
+ }
+ case 13: // Libary Ranch Search
+ if (dynamicInput.Length >= 2)
+ {
+ string searchQuery = dynamicInput[1];
+ sender.LoggedinUser.MajorPriority = true;
+ byte[] serachResponse = PacketBuilder.CreateMetaPacket(Meta.BuildRanchSearchResults(searchQuery));
+ sender.SendPacket(serachResponse);
+ break;
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (private notes, wrong size)");
+ break;
+ }
+ case 14:
+ if(dynamicInput.Length >= 1)
+ {
+ string password = dynamicInput[1];
+ // Get current tile
+ if(World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
+ {
+ World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
+ if(tile.Code != null)
+ {
+ if (tile.Code.StartsWith("PASSWORD-"))
+ {
+ string[] args = tile.Code.Replace("!", "-").Split('-');
+ if (args.Length >= 3)
+ {
+ string expectedPassword = args[1];
+ int questId = int.Parse(args[2]);
+ if (password.ToLower() == expectedPassword.ToLower())
+ {
+ Quest.CompleteQuest(sender.LoggedinUser, Quest.GetQuestById(questId), false);
+ }
+ else
+ {
+ Quest.QuestResult result = Quest.FailQuest(sender.LoggedinUser, Quest.GetQuestById(questId), true);
+ if (result.NpcChat == null || result.NpcChat == "")
+ result.NpcChat = Messages.IncorrectPasswordMessage;
+ byte[] ChatPacket = PacketBuilder.CreateChat(result.NpcChat, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(ChatPacket);
+ }
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Send invalid password input request. (Too few arguments!)");
+ break;
+ }
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Send password input request. (Not on password tile!)");
+ break;
+ }
+ }
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Sent a password while not in a special tile.");
+ break;
+ }
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid password request, (wrong size)");
+ break;
+ }
+
+ break;
+ case 15: // Real Time Quiz
+ if (dynamicInput.Length >= 2)
+ {
+ if(QuizEvent != null)
+ {
+ if (sender.LoggedinUser.InRealTimeQuiz)
+ {
+ RealTimeQuiz.Participent participent = QuizEvent.JoinEvent(sender.LoggedinUser);
+ string answer = dynamicInput[1];
+ participent.CheckAnswer(answer);
+ }
+ }
+ break;
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (RealTimeQuiz, wrong size)");
+ break;
+ }
+ default:
+ Logger.ErrorPrint("Unknown dynamic input: " + inputId.ToString() + " packet dump: " + BitConverter.ToString(packet).Replace("-", " "));
+ break;
+ }
+
+
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to send a invalid dynamic input (wrong size)");
+ return;
+ }
+ }
+
+
+ }
+
+ public static void OnPlayerInfoPacket(GameClient sender, byte[] packet)
+ {
+ if (!sender.LoggedIn)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " Requests player info when not logged in.");
+ return;
+ }
+ if(packet.Length < 3)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent playerinfo packet of wrong size");
+ }
+
+ byte method = packet[1];
+ switch(method)
+ {
+ case PacketBuilder.PLAYERINFO_PLAYER_LIST:
+ sender.LoggedinUser.MajorPriority = true;
+ byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildPlayerListMenu(sender.LoggedinUser));
+ sender.SendPacket(metaPacket);
+ break;
+ }
+
+ }
+ public static void OnDynamicButtonPressed(GameClient sender, byte[] packet)
+ {
+ if (!sender.LoggedIn)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " Clicked dyamic button when not logged in.");
+ return;
+ }
+ string packetStr = Encoding.UTF8.GetString(packet);
+ string buttonIdStr = packetStr.Substring(1, packetStr.Length - 3);
+
+ switch(buttonIdStr)
+ {
+ case "2": // Compose Mail
+ if(sender.LoggedinUser.Money <= 3)
+ {
+ byte[] cantAffordPostage = PacketBuilder.CreateChat(Messages.CityHallCantAffordPostageMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantAffordPostage);
+ break;
+ }
+ sender.LoggedinUser.MajorPriority = true;
+ byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildComposeMailMenu());
+ sender.SendPacket(metaPacket);
+ break;
+ case "3": // Quest Log
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildQuestLog(sender.LoggedinUser));
+ sender.SendPacket(metaPacket);
+ break;
+ case "4": // View Horse Breeds
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildHorseBreedListLibary());
+ sender.SendPacket(metaPacket);
+ break;
+ case "5": // Back to horse
+ if (sender.LoggedinUser.LastViewedHorse != null)
+ UpdateHorseMenu(sender, sender.LoggedinUser.LastViewedHorse);
+ break;
+ case "6": // Equip companion
+ if (sender.LoggedinUser.LastViewedHorse != null)
+ {
+ sender.LoggedinUser.MajorPriority = true;
+ HorseInstance horseInstance = sender.LoggedinUser.LastViewedHorse;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildHorseCompanionEquipMenu(horseInstance,sender.LoggedinUser));
+ sender.SendPacket(metaPacket);
+ }
+ break;
+ case "7": // TP To nearest wagon (ranch)
+ if(sender.LoggedinUser.OwnedRanch != null)
+ {
+ if(sender.LoggedinUser.OwnedRanch.GetBuildingCount(7) > 0) // Wagon
+ {
+ int ranchX = sender.LoggedinUser.OwnedRanch.X;
+ int ranchY = sender.LoggedinUser.OwnedRanch.Y;
+
+ double smallestDistance = Double.PositiveInfinity;
+ int smalestTransportPointId = 0;
+ for (int i = 0; i < Transport.TransportPoints.Count; i++)
+ {
+ Transport.TransportPoint tpPoint = Transport.TransportPoints[i];
+
+ if(Transport.GetTransportLocation(tpPoint.Locations[0]).Type == "WAGON") // is wagon?
+ {
+ double distance = Util.PointsToDistance(ranchX, ranchY, tpPoint.X, tpPoint.Y);
+ if(distance < smallestDistance)
+ {
+ smallestDistance = distance;
+ smalestTransportPointId = i;
+ }
+ }
+ }
+ Transport.TransportPoint newPoint = Transport.TransportPoints[smalestTransportPointId];
+
+ int newX = newPoint.X;
+ int newY = newPoint.Y;
+
+ if (World.InSpecialTile(newX, newY))
+ {
+ World.SpecialTile tile = World.GetSpecialTile(newX, newY);
+ if (tile.ExitX != 0)
+ newX = tile.ExitX;
+ if (tile.ExitY != 0)
+ newY = tile.ExitY;
+ }
+
+ byte[] transported = PacketBuilder.CreateChat(Messages.RanchWagonDroppedYouOff, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(transported);
+ sender.LoggedinUser.Teleport(newX, newY);
+ }
+ }
+ break;
+ case "8":
+ if(sender.LoggedinUser.LastViewedHorse != null)
+ {
+ sender.LoggedinUser.MajorPriority = true;
+ HorseInstance horseInstance = sender.LoggedinUser.LastViewedHorse;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildHorseReleaseConfirmationMessage(horseInstance));
+ sender.SendPacket(metaPacket);
+ }
+ break;
+ case "9": // View Tack (Libary)
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildTackLibary());
+ sender.SendPacket(metaPacket);
+ break;
+ case "10": // View Companions (Libary)
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildCompanionLibary());
+ sender.SendPacket(metaPacket);
+ break;
+ case "11": // Randomize horse name
+ if (sender.LoggedinUser.LastViewedHorse != null)
+ {
+ sender.LoggedinUser.MajorPriority = true;
+ HorseInstance horseInstance = sender.LoggedinUser.LastViewedHorse;
+ horseInstance.ChangeNameWithoutUpdatingDatabase(HorseInfo.GenerateHorseName());
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildHorseDescriptionEditMeta(horseInstance));
+ sender.SendPacket(metaPacket);
+ }
+ break;
+ case "12": // View Minigames (Libary)
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildMinigamesLibary());
+ sender.SendPacket(metaPacket);
+ break;
+ case "13": // Train All (Ranch)
+ if (sender.LoggedinUser.OwnedRanch != null)
+ {
+ if(sender.LoggedinUser.OwnedRanch.GetBuildingCount(6) > 0) // Training Pen
+ {
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildRanchTraining(sender.LoggedinUser));
+ sender.SendPacket(metaPacket);
+ }
+ }
+ break;
+ case "14": // Most Valued Ranches
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildMostValuedRanches());
+ sender.SendPacket(metaPacket);
+ break;
+ case "15": // Most Richest Players
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildRichestPlayers());
+ sender.SendPacket(metaPacket);
+ break;
+ case "16": // Most Adventurous Players
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildAdventurousPlayers());
+ sender.SendPacket(metaPacket);
+ break;
+ case "17": // Most Experienced Players
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildExperiencedPlayers());
+ sender.SendPacket(metaPacket);
+ break;
+ case "18": // Best Minigame Players
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildMinigamePlayers());
+ sender.SendPacket(metaPacket);
+ break;
+ case "19": // Most Experienced Horses
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildMostExperienedHoses());
+ sender.SendPacket(metaPacket);
+ break;
+ case "20": // Minigame Rankings
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildMinigameRankingsForUser(sender.LoggedinUser));
+ sender.SendPacket(metaPacket);
+ break;
+ case "21": // Private Notes
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildPrivateNotes(sender.LoggedinUser));
+ sender.SendPacket(metaPacket);
+ break;
+ case "22": // View Locations (Libary)
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildLocationsLibary());
+ sender.SendPacket(metaPacket);
+ break;
+ case "23": // View Awards (Libary)
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildAwardsLibary());
+ sender.SendPacket(metaPacket);
+ break;
+ case "26": // Buy Horse (Auto Sell)
+ if(sender.LoggedinUser.LastViewedHorseOther != null)
+ {
+ bool isOnRanch = false;
+ bool isOnPlayer = false;
+ HorseInstance horseToSell = sender.LoggedinUser.LastViewedHorseOther;
+ if (Ranch.IsRanchOwned(horseToSell.Owner))
+ {
+ Ranch ranch = Ranch.GetRanchOwnedBy(horseToSell.Owner);
+ if(sender.LoggedinUser.X == ranch.X && sender.LoggedinUser.Y == ranch.Y)
+ {
+ isOnRanch = true;
+ }
+
+ }
+ if(GameServer.IsUserOnline(horseToSell.Owner))
+ {
+ User user = GameServer.GetUserById(horseToSell.Owner);
+ if (user.X == sender.LoggedinUser.X && user.Y == sender.LoggedinUser.Y)
+ {
+ isOnPlayer = true;
+ }
+ }
+
+ if (isOnRanch || isOnPlayer)
+ {
+
+ if (horseToSell.AutoSell == 0)
+ break;
+ if(sender.LoggedinUser.Money >= horseToSell.AutoSell)
+ {
+ if (sender.LoggedinUser.HorseInventory.HorseList.Length + 1 > sender.LoggedinUser.MaxHorses)
+ {
+ byte[] tooManyHorses = PacketBuilder.CreateChat(Messages.AutoSellTooManyHorses, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(tooManyHorses);
+ break;
+ }
+
+ sender.LoggedinUser.TakeMoney(horseToSell.AutoSell);
+
+ if (IsUserOnline(horseToSell.Owner))
+ {
+ User seller = GetUserById(horseToSell.Owner);
+ seller.HorseInventory.DeleteHorse(horseToSell, false);
+ seller.AddMoney(horseToSell.AutoSell);
+
+ byte[] horseBrought = PacketBuilder.CreateChat(Messages.FormatAutoSellSold(horseToSell.Name, horseToSell.AutoSell, sender.LoggedinUser.Username), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ seller.LoggedinClient.SendPacket(horseBrought);
+ }
+ else
+ {
+ Database.AddMessageToQueue(horseToSell.Owner, Messages.FormatAutoSellSoldOffline(horseToSell.Name, horseToSell.AutoSell, sender.LoggedinUser.Username));
+ try
+ {
+ Database.SetPlayerMoney((Database.GetPlayerMoney(horseToSell.Owner) + horseToSell.AutoSell), horseToSell.Owner);
+ }
+ catch (OverflowException)
+ {
+ Database.SetPlayerMoney(2147483647, horseToSell.Owner);
+ }
+ }
+
+ horseToSell.Owner = sender.LoggedinUser.Id;
+ horseToSell.AutoSell = 0;
+ sender.LoggedinUser.HorseInventory.AddHorse(horseToSell, false);
+
+ byte[] success = PacketBuilder.CreateChat(Messages.FormatAutoSellSuccess(horseToSell.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(success);
+
+ UpdateArea(sender);
+ break;
+ }
+ else
+ {
+ byte[] noMoney = PacketBuilder.CreateChat(Messages.AutoSellInsufficentFunds, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(noMoney);
+ break;
+ }
+
+ }
+ else
+ {
+ byte[] notInRightPlace = PacketBuilder.CreateChat(Messages.AutoSellNotStandingInSamePlace, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(notInRightPlace);
+ break;
+ }
+
+
+ }
+ break;
+ case "24": // Award List
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildAwardList(sender.LoggedinUser));
+ sender.SendPacket(metaPacket);
+ break;
+ case "27": // Ranch Edit
+ if(sender.LoggedinUser.OwnedRanch != null)
+ {
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildRanchEdit(sender.LoggedinUser.OwnedRanch));
+ sender.SendPacket(metaPacket);
+ }
+ break;
+ case "29": // Auto Sell Horses
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildTopAutoSellHorses());
+ sender.SendPacket(metaPacket);
+ break;
+ case "31":
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildRanchSearchLibary());
+ sender.SendPacket(metaPacket);
+ break;
+ case "35": // Buddy List
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildBuddyList(sender.LoggedinUser));
+ sender.SendPacket(metaPacket);
+ break;
+ case "36": // Nearby list
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildNearbyList(sender.LoggedinUser));
+ sender.SendPacket(metaPacket);
+ break;
+ case "37": // All Players List
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildPlayerList(sender.LoggedinUser));
+ sender.SendPacket(metaPacket);
+ break;
+ case "40": // All Players Alphabetical
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildPlayerListAlphabetical(sender.LoggedinUser));
+ sender.SendPacket(metaPacket);
+ break;
+ case "30": // Find NPC
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildFindNpcMenu());
+ sender.SendPacket(metaPacket);
+ break;
+ case "25": // Set auto sell price
+ if (sender.LoggedinUser.LastViewedHorse != null)
+ {
+ sender.LoggedinUser.MajorPriority = true;
+ HorseInstance horseInstance = sender.LoggedinUser.LastViewedHorse;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildAutoSellMenu(horseInstance));
+ sender.SendPacket(metaPacket);
+ }
+ break;
+ case "33": // View All stats (Horse)
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildAllBasicStats(sender.LoggedinUser));
+ sender.SendPacket(metaPacket);
+ break;
+ case "34": // View Basic stats (Horse)
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildAllStats(sender.LoggedinUser));
+ sender.SendPacket(metaPacket);
+ break;
+ case "38": // Read Books
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildBooksLibary());
+ sender.SendPacket(metaPacket);
+ break;
+ case "41": // Put horse into auction
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildAuctionHorseList(sender.LoggedinUser));
+ sender.SendPacket(metaPacket);
+ break;
+ case "47":
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildPawneerOrderBreedList());
+ sender.SendPacket(metaPacket);
+ break;
+ case "53": // Misc Stats / Tracked Items
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildMiscStats(sender.LoggedinUser));
+ sender.SendPacket(metaPacket);
+ break;
+ case "58": // Add new item to trade
+ if(sender.LoggedinUser.TradingWith != null)
+ {
+ sender.LoggedinUser.TradeMenuPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildTradeAdd(sender.LoggedinUser.TradingWith));
+ sender.SendPacket(metaPacket);
+ }
+ break;
+ case "59": // Done
+ if (sender.LoggedinUser.TradingWith != null)
+ {
+ sender.LoggedinUser.TradingWith.Stage = "DONE";
+
+ if (sender.LoggedinUser.TradingWith != null)
+ if (sender.LoggedinUser.TradingWith.OtherTrade.Trader.TradeMenuPriority == false)
+ UpdateArea(sender.LoggedinUser.TradingWith.OtherTrade.Trader.LoggedinClient);
+ UpdateArea(sender);
+
+ }
+ break;
+ case "60": // Ranch Sell
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildRanchSellConfirmation());
+ sender.SendPacket(metaPacket);
+ break;
+ case "61": // Most Spoiled Horse
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildMostSpoiledHorses());
+ sender.SendPacket(metaPacket);
+ break;
+ case "28c1": // Abuse Report
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildAbuseReportPage());
+ sender.SendPacket(metaPacket);
+ break;
+ case "52c1": // Horse set to KEEPER
+ string category = "KEEPER";
+ goto setCategory;
+ case "52c2": // Horse set to TRAINING
+ category = "TRAINING";
+ goto setCategory;
+ case "52c3": // Horse set to TRADING
+ category = "TRADING";
+ goto setCategory;
+ case "52c4": // Horse set to RETIRED
+ category = "RETIRED";
+ goto setCategory;
+ setCategory:;
+ if (sender.LoggedinUser.LastViewedHorse != null)
+ {
+ sender.LoggedinUser.LastViewedHorse.Category = category;
+ byte[] categoryChangedPacket = PacketBuilder.CreateChat(Messages.FormatHorseSetToNewCategory(category), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(categoryChangedPacket);
+
+ sender.LoggedinUser.MajorPriority = true;
+ UpdateHorseMenu(sender, sender.LoggedinUser.LastViewedHorse);
+ }
+ break;
+
+ default:
+ if(buttonIdStr.StartsWith("39c")) // Book Read
+ {
+ string idStr = buttonIdStr.Substring(3);
+ int bookId = -1;
+ try
+ {
+ bookId = int.Parse(idStr);
+ }
+ catch (FormatException)
+ {
+ Logger.DebugPrint(sender.LoggedinUser.Username + " Tried to read a book of id NaN");
+ break;
+ };
+
+ if(Book.BookExists(bookId))
+ {
+ Book book = Book.GetBookById(bookId);
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildBookReadLibary(book));
+ sender.SendPacket(metaPacket);
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + "Tried to read a book that doesnt exist.");
+ }
+ break;
+ }
+ if (buttonIdStr.StartsWith("32c")) // Horse Whisperer
+ {
+ string idStr = buttonIdStr.Substring(3);
+ int breedId = -1;
+ try
+ {
+ breedId = int.Parse(idStr);
+ }
+ catch (FormatException)
+ {
+ Logger.DebugPrint(sender.LoggedinUser.Username + " Tried to whisper a horse with BreedId NaN.");
+ break;
+ };
+
+ if (sender.LoggedinUser.Money < 50000)
+ {
+ byte[] cannotAffordMessage = PacketBuilder.CreateChat(Messages.WhispererServiceCannotAfford, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cannotAffordMessage);
+ break;
+ }
+
+ List horsesFound = new List();
+ foreach (WildHorse horse in WildHorse.WildHorses)
+ {
+ if (horse.Instance.Breed.Id == breedId)
+ {
+ horsesFound.Add(horse);
+ }
+ }
+ int cost = 0;
+ if (horsesFound.Count >= 1)
+ {
+ cost = 50000;
+ }
+ else
+ {
+ cost = 10000;
+ }
+ sender.LoggedinUser.MajorPriority = true;
+
+ byte[] pricingMessage = PacketBuilder.CreateChat(Messages.FormatWhispererPrice(cost), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(pricingMessage);
+
+ byte[] serachResultMeta = PacketBuilder.CreateMetaPacket(Meta.BuildWhisperSearchResults(horsesFound.ToArray()));
+ sender.SendPacket(serachResultMeta);
+
+ sender.LoggedinUser.TakeMoney(cost);
+ break;
+ }
+ else if (buttonIdStr.StartsWith("4c")) // Libary Breed Search
+ {
+ string idStr = buttonIdStr.Substring(2);
+ int breedId = -1;
+ HorseInfo.Breed horseBreed;
+ try
+ {
+ breedId = int.Parse(idStr);
+ horseBreed = HorseInfo.GetBreedById(breedId);
+ }
+ catch (Exception)
+ {
+ Logger.DebugPrint(sender.LoggedinUser.Username + " Sent invalid libary breed viewer request.");
+ break;
+ };
+ sender.LoggedinUser.MajorPriority = true;
+ string metaTag = Meta.BuildBreedViewerLibary(horseBreed);
+ metaPacket = PacketBuilder.CreateMetaPacket(metaTag);
+ sender.SendPacket(metaPacket);
+
+ string swf = "breedviewer.swf?terrain=book&breed=" + horseBreed.Swf + "&j=";
+ byte[] loadSwf = PacketBuilder.CreateSwfModulePacket(swf, PacketBuilder.PACKET_SWF_MODULE_FORCE);
+ sender.SendPacket(loadSwf);
+
+ break;
+
+ }
+ else if (buttonIdStr.StartsWith("50c"))
+ {
+ string gender = buttonIdStr.Substring(3);
+ if (sender.LoggedinUser.PawneerOrderBreed != null)
+ {
+ if (sender.LoggedinUser.PawneerOrderBreed.GenderTypes().Contains(gender))
+ {
+ if (sender.LoggedinUser.Inventory.HasItemId(Item.PawneerOrder))
+ {
+ sender.LoggedinUser.PawneerOrderGender = gender;
+
+ HorseInstance horseInstance = new HorseInstance(sender.LoggedinUser.PawneerOrderBreed);
+ horseInstance.Color = sender.LoggedinUser.PawneerOrderColor;
+ horseInstance.Gender = sender.LoggedinUser.PawneerOrderGender;
+ horseInstance.Name = "Pawneer Order";
+
+ sender.LoggedinUser.Inventory.Remove(sender.LoggedinUser.Inventory.GetItemByItemId(Item.PawneerOrder).ItemInstances[0]);
+ sender.LoggedinUser.HorseInventory.AddHorse(horseInstance, true, true);
+
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildPawneerOrderFound(horseInstance));
+ sender.SendPacket(metaPacket);
+ break;
+ }
+ }
+ }
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Error occured when doing a Pawneer Order.");
+ break;
+ }
+ else if (buttonIdStr.StartsWith("49c"))
+ {
+ string color = buttonIdStr.Substring(3);
+ if (sender.LoggedinUser.PawneerOrderBreed != null)
+ {
+ if (sender.LoggedinUser.PawneerOrderBreed.Colors.Contains(color))
+ {
+ sender.LoggedinUser.PawneerOrderColor = color;
+
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildPawneerOrderGenderList(sender.LoggedinUser.PawneerOrderBreed, color));
+ sender.SendPacket(metaPacket);
+ break;
+ }
+ }
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Asked for a horse of an unknown color " + color);
+ break;
+ }
+ else if (buttonIdStr.StartsWith("48c")) // Pawneer Order Breed Select
+ {
+ string idStr = buttonIdStr.Substring(3);
+ int breedId = -1;
+ HorseInfo.Breed breed;
+ try
+ {
+ breedId = int.Parse(idStr);
+ breed = HorseInfo.GetBreedById(breedId);
+ }
+ catch (Exception)
+ {
+ Logger.DebugPrint(sender.LoggedinUser.Username + " Tried to pawner order a horse with id NaN.");
+ break;
+ }
+ sender.LoggedinUser.PawneerOrderBreed = breed;
+
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildPawneerOrderColorList(breed));
+ sender.SendPacket(metaPacket);
+ break;
+ }
+ else if (buttonIdStr.StartsWith("43c")) // Pawn Horse Confirm
+ {
+ string idStr = buttonIdStr.Substring(3);
+ int horseId = -1;
+ try
+ {
+ horseId = int.Parse(idStr);
+ }
+ catch (FormatException)
+ {
+ Logger.DebugPrint(sender.LoggedinUser.Username + " Tried to pawn a horse with id NaN.");
+ break;
+ }
+
+ if (sender.LoggedinUser.HorseInventory.HorseIdExist(horseId))
+ {
+ HorseInstance inst = sender.LoggedinUser.HorseInventory.GetHorseById(horseId);
+ int price = Pawneer.CalculateTotalPrice(inst);
+ string name = inst.Name;
+
+ sender.LoggedinUser.HorseInventory.DeleteHorse(inst); // 1000% a "distant land.."
+ sender.LoggedinUser.LastViewedHorse = null;
+
+ sender.LoggedinUser.AddMoney(price);
+ byte[] soldHorseMessage = PacketBuilder.CreateChat(Messages.FormatPawneerSold(name, price), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(soldHorseMessage);
+
+ sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.HorsePawn).Count++;
+ if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.HorsePawn).Count >= 100)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(44)); // Vendor
+ if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.HorsePawn).Count >= 1000)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(45)); // Pro Vendor
+ if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.HorsePawn).Count >= 10000)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(52)); // Top Vendor
+
+ UpdateArea(sender);
+
+ break;
+ }
+ else
+ {
+ byte[] cantFindHorse = PacketBuilder.CreateChat(Messages.PawneerHorseNotFound, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantFindHorse);
+ }
+ break;
+ }
+ else if (buttonIdStr.StartsWith("51c")) // Pawn Horse
+ {
+ string idStr = buttonIdStr.Substring(3);
+ int horseId = -1;
+ try
+ {
+ horseId = int.Parse(idStr);
+ }
+ catch (FormatException)
+ {
+ Logger.DebugPrint(sender.LoggedinUser.Username + " Tried to pawn a horse with id NaN.");
+ break;
+ }
+
+ if (sender.LoggedinUser.HorseInventory.HorseIdExist(horseId))
+ {
+ HorseInstance inst = sender.LoggedinUser.HorseInventory.GetHorseById(horseId);
+
+ sender.LoggedinUser.MajorPriority = true;
+ byte[] confirmScreen = PacketBuilder.CreateMetaPacket(Meta.BuildPawneerConfimation(inst));
+ sender.SendPacket(confirmScreen);
+ break;
+ }
+ else
+ {
+ byte[] cantFindHorse = PacketBuilder.CreateChat(Messages.PawneerHorseNotFound, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantFindHorse);
+ }
+ break;
+ }
+ else if (buttonIdStr.StartsWith("42c"))
+ {
+ string idStr = buttonIdStr.Substring(3);
+ int horseId = -1;
+ try
+ {
+ horseId = int.Parse(idStr);
+ }
+ catch (FormatException)
+ {
+ Logger.DebugPrint(sender.LoggedinUser.Username + " Tried to auction a horse with id NaN.");
+ break;
+ }
+ if (sender.LoggedinUser.HorseInventory.HorseIdExist(horseId))
+ {
+ HorseInstance inst = sender.LoggedinUser.HorseInventory.GetHorseById(horseId);
+
+ if(World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y))
+ {
+ World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y);
+ if(tile.Code == null || !tile.Code.StartsWith("AUCTION-"))
+ {
+ Logger.ErrorPrint("Cant find auction room that " + sender.LoggedinUser.Username + " Is trying to place a horse in.");
+ return;
+ }
+ Auction auctionRoom = Auction.GetAuctionRoomById(int.Parse(tile.Code.Split('-')[1]));
+ if(auctionRoom.HasUserPlacedAuctionAllready(sender.LoggedinUser))
+ {
+ byte[] cantPlaceAuction = PacketBuilder.CreateChat(Messages.AuctionOneHorsePerPlayer, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantPlaceAuction);
+ break;
+ }
+ if (sender.LoggedinUser.Money >= 1000)
+ {
+ sender.LoggedinUser.TakeMoney(1000);
+ Auction.AuctionEntry entry = new Auction.AuctionEntry(8, 0, sender.LoggedinUser.Id);
+ entry.Horse = inst;
+ entry.OwnerId = sender.LoggedinUser.Id;
+ entry.Completed = false;
+ inst.Hidden = true;
+ auctionRoom.AddEntry(entry);
+ UpdateArea(sender);
+ UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y, true);
+ break;
+ }
+ else
+ {
+ byte[] cantAffordAuctionMsg = PacketBuilder.CreateChat(Messages.AuctionCantAffordAuctionFee, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantAffordAuctionMsg);
+ }
+ }
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to auction a horse they did not have.");
+ break;
+ }
+ }
+ if (Leaser.LeaserButtonIdExists(buttonIdStr))
+ {
+ Leaser horseLeaser = Leaser.GetLeaserByButtonId(buttonIdStr);
+
+ if(sender.LoggedinUser.Money >= horseLeaser.Price)
+ {
+ if(sender.LoggedinUser.HorseInventory.HorseList.Length + 1 > sender.LoggedinUser.MaxHorses)
+ {
+ byte[] cantManageHorses = PacketBuilder.CreateChat(Messages.HorseLeaserHorsesFull, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantManageHorses);
+ break;
+ }
+ else
+ {
+ sender.LoggedinUser.MajorPriority = true;
+ sender.LoggedinUser.TakeMoney(horseLeaser.Price);
+
+ HorseInstance leaseHorse = horseLeaser.GenerateLeaseHorse();
+
+ if(leaseHorse.Breed.Id == 170) // UniPeg
+ {
+ sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.UnipegTeamup).Count++;
+ if(sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.UnipegTeamup).Count >= 5)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(55)); // UniPeg Friend
+ }
+ else if(leaseHorse.Breed.Type == "unicorn")
+ {
+ sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.UnicornTeamup).Count++;
+ if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.UnicornTeamup).Count >= 5)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(42)); // Unicorn Friend
+ }
+ else if(leaseHorse.Breed.Type == "pegasus")
+ {
+ sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.PegasusTeamup).Count++;
+ if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.PegasusTeamup).Count >= 5)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(43)); // Pegasus Friend
+ }
+
+ sender.LoggedinUser.HorseInventory.AddHorse(leaseHorse);
+
+ byte[] addedHorseMeta = PacketBuilder.CreateMetaPacket(Meta.BuildLeaserOnLeaseInfo(horseLeaser));
+ sender.SendPacket(addedHorseMeta);
+
+ byte[] addedNewTempHorseMessage = PacketBuilder.CreateChat(Messages.HorseLeaserTemporaryHorseAdded, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(addedNewTempHorseMessage);
+ break;
+
+ }
+ }
+ else
+ {
+ byte[] cantAffordLease = PacketBuilder.CreateChat(Messages.HorseLeaserCantAffordMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantAffordLease);
+ break;
+ }
+
+ }
+ if(AbuseReport.DoesReasonExist(buttonIdStr))
+ {
+ sender.LoggedinUser.MajorPriority = true;
+ metaPacket = PacketBuilder.CreateMetaPacket(AbuseReport.GetReasonById(buttonIdStr).Meta);
+ sender.SendPacket(metaPacket);
+ break;
+ }
+
+ Logger.ErrorPrint("Dynamic button #" + buttonIdStr + " unknown... Packet Dump: "+BitConverter.ToString(packet).Replace("-", " "));
+ break;
+ }
+ }
+ public static void OnArenaScored(GameClient sender, byte[] packet)
+ {
+ if (!sender.LoggedIn)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " Requested user information when not logged in.");
+ return;
+ }
+ if(packet.Length <= 3)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + "Sent invalid Arena Scored Packet.");
+ return;
+ }
+ string packetStr = Encoding.UTF8.GetString(packet);
+ string scoreStr = packetStr.Substring(1, packet.Length - 3);
+ int score = -1;
+ try
+ {
+ score = int.Parse(scoreStr);
+ }
+ catch(FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Scored NAN in an arena.");
+ return;
+ }
+
+ if(Arena.UserHasEnteredHorseInAnyArena(sender.LoggedinUser))
+ {
+ byte[] waitingOnResults = PacketBuilder.CreateChat(Messages.FormatArenaYourScore(score), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(waitingOnResults);
+
+ Arena enteredArena = Arena.GetArenaUserEnteredIn(sender.LoggedinUser);
+ enteredArena.SubmitScore(sender.LoggedinUser, score);
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Scored in an arena while not in one");
+ }
+ return;
+
+ }
+ public static void OnUserInfoRequest(GameClient sender, byte[] packet)
+ {
+ if (!sender.LoggedIn)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " Requested user information when not logged in.");
+ return;
+ }
+
+ // Prevent duplicate requests.
+ if (sender.LoggedinUser.UserInfoSend)
+ return;
+
+ sender.LoggedinUser.UserInfoSend = true;
+
+ // This allows the website to view that the player is online.
+ Database.AddOnlineUser(sender.LoggedinUser.Id, sender.LoggedinUser.Administrator, sender.LoggedinUser.Moderator, sender.LoggedinUser.Subscribed, sender.LoggedinUser.NewPlayer);
+
+ Logger.DebugPrint(sender.LoggedinUser.Username + " Requested user information.");
+ User user = sender.LoggedinUser;
+
+ // Send player current location & map data
+ byte[] MovementPacket = PacketBuilder.CreateMovementPacket(user.X, user.Y, user.CharacterId, user.Facing, PacketBuilder.DIRECTION_TELEPORT, true);
+ sender.SendPacket(MovementPacket);
+
+ // Send "Welcome to the Secret Land of Horses" message.
+ byte[] WelcomeMessage = PacketBuilder.CreateWelcomeMessage(user.Username);
+ sender.SendPacket(WelcomeMessage);
+
+ // Send weather effects, and current server time.
+ byte[] WorldData = PacketBuilder.CreateWorldData(World.ServerTime.Minutes, World.ServerTime.Days, World.ServerTime.Years, sender.LoggedinUser.GetWeatherSeen());
+ sender.SendPacket(WorldData);
+
+ // if the player is logging in for the first time, send Welcome newest rider of Horse Isle message.
+ if (sender.LoggedinUser.NewPlayer)
+ {
+ byte[] NewUserMessage = PacketBuilder.CreateChat(Messages.NewUserMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(NewUserMessage);
+ }
+
+ // Send Security Codes, used (badly) to verify Minigame Rewards
+ byte[] SecCodePacket = PacketBuilder.CreateSecCode(user.SecCodeSeeds, user.SecCodeInc, user.Administrator, user.Moderator);
+ sender.SendPacket(SecCodePacket);
+
+ // Send player money count, total players and total unread mail.
+ byte[] BaseStatsPacketData = PacketBuilder.CreatePlayerData(user.Money, GameServer.GetNumberOfPlayers(), user.MailBox.UnreadMailCount);
+ sender.SendPacket(BaseStatsPacketData);
+
+ // Sends Meta Window information (Nearby, current tile, etc)
+ UpdateArea(sender);
+
+ /*
+ * Send all nearby players locations to the client
+ * if there not nearby, say there at 1000,1000.
+ */
+ foreach (GameClient client in GameClient.ConnectedClients)
+ {
+ if (client.LoggedIn)
+ {
+ if (client.LoggedinUser.Id != user.Id)
+ {
+ if(IsOnScreen(client.LoggedinUser.X, client.LoggedinUser.Y, sender.LoggedinUser.X, sender.LoggedinUser.Y))
+ {
+ byte[] PlayerInfo = PacketBuilder.CreatePlayerInfoUpdateOrCreate(client.LoggedinUser.X, client.LoggedinUser.Y, client.LoggedinUser.Facing, client.LoggedinUser.CharacterId, client.LoggedinUser.Username);
+ sender.SendPacket(PlayerInfo);
+ }
+ else
+ {
+ byte[] PlayerInfo = PacketBuilder.CreatePlayerInfoUpdateOrCreate(1000+4, 1000+1, client.LoggedinUser.Facing, client.LoggedinUser.CharacterId, client.LoggedinUser.Username);
+ sender.SendPacket(PlayerInfo);
+ }
+ }
+ }
+ }
+
+ /*
+ * Update all nearby users
+ * that the new player logged in.
+ */
+ foreach (User nearbyUser in GameServer.GetNearbyUsers(sender.LoggedinUser.X, sender.LoggedinUser.Y, false, false))
+ if (nearbyUser.Id != sender.LoggedinUser.Id)
+ if(!nearbyUser.MajorPriority)
+ if(!nearbyUser.MinorPriority)
+ UpdateArea(nearbyUser.LoggedinClient);
+
+ /*
+ * Send a list of isles, towns and areas to the player
+ * This is used for the world map.
+ */
+
+ byte[] IsleData = PacketBuilder.CreatePlaceData(World.Isles.ToArray(), World.Towns.ToArray(), World.Areas.ToArray());
+ sender.SendPacket(IsleData);
+
+ // Tells the client which tiles are passable, which the player should appear ontop of and which it should be below.
+ byte[] TileFlags = PacketBuilder.CreateTileOverlayFlags(Map.OverlayTileDepth);
+ sender.SendPacket(TileFlags);
+
+ // Send Todays Note:
+ byte[] MotdData = PacketBuilder.CreateMotd();
+ sender.SendPacket(MotdData);
+
+ // Send riddle annoucement
+ if (RiddleEvent != null)
+ if (RiddleEvent.Active)
+ RiddleEvent.ShowStartMessage(sender);
+
+ /*
+ * Gives Queued Items
+ * When you buy a PO from the store on the website
+ * its added to this queued items list.
+ */
+ DoItemPurchases(sender);
+
+ // Send Queued Messages
+ string[] queuedMessages = Database.GetMessageQueue(sender.LoggedinUser.Id);
+ foreach(string queuedMessage in queuedMessages)
+ {
+ byte[] msg = PacketBuilder.CreateChat(Messages.MessageQueueHeader+queuedMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(msg);
+ }
+ Database.ClearMessageQueue(sender.LoggedinUser.Id);
+
+ // Send "Playername Logged in" message
+ byte[] loginMessageBytes = PacketBuilder.CreateChat(Messages.FormatLoginMessage(sender.LoggedinUser.Username), PacketBuilder.CHAT_BOTTOM_LEFT);
+ foreach (GameClient client in GameClient.ConnectedClients)
+ if (client.LoggedIn)
+ if (!client.LoggedinUser.MuteLogins && !client.LoggedinUser.MuteAll)
+ if (client.LoggedinUser.Id != sender.LoggedinUser.Id)
+ client.SendPacket(loginMessageBytes);
+
+
+ /*
+ * Send players nearby to you
+ * your position, otherwise just send 1000,1000
+ */
+ byte[] yourPlayerInfo = PacketBuilder.CreatePlayerInfoUpdateOrCreate(sender.LoggedinUser.X, sender.LoggedinUser.Y, sender.LoggedinUser.Facing, sender.LoggedinUser.CharacterId, sender.LoggedinUser.Username);
+ byte[] yourPlayerInfoOffscreen = PacketBuilder.CreatePlayerInfoUpdateOrCreate(1000 + 4, 1000 + 1, sender.LoggedinUser.Facing, sender.LoggedinUser.CharacterId, sender.LoggedinUser.Username);
+
+ foreach (GameClient client in GameClient.ConnectedClients)
+ {
+ if (client.LoggedIn)
+ {
+ if (client.LoggedinUser.Id != sender.LoggedinUser.Id)
+ {
+ if (IsOnScreen(client.LoggedinUser.X, client.LoggedinUser.Y, sender.LoggedinUser.X, sender.LoggedinUser.Y))
+ client.SendPacket(yourPlayerInfo);
+ else
+ client.SendPacket(yourPlayerInfoOffscreen);
+ }
+ }
+ }
+
+
+
+ }
+
+ public static void OnSwfModuleCommunication(GameClient sender, byte[] packet)
+ {
+ if (!sender.LoggedIn)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " tried to send swf communication when not logged in.");
+ return;
+ }
+ if (packet.Length < 4)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid swf commmunication Packet");
+ return;
+ }
+
+
+ byte module = packet[1];
+ switch(module)
+ {
+ case PacketBuilder.SWFMODULE_INVITE:
+ if(packet.Length < 4)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid 2PLAYER INVITE Packet (WRONG SIZE)");
+ break;
+ }
+ string packetStr = Encoding.UTF8.GetString(packet);
+ string playerIdStr = packetStr.Substring(2, packetStr.Length - 4);
+ int playerId = -1;
+ try
+ {
+ playerId = int.Parse(playerIdStr);
+ }
+ catch (Exception) { };
+
+ if(IsUserOnline(playerId))
+ {
+ User toInvite = GetUserById(playerId);
+ TwoPlayer twoPlayerGame = new TwoPlayer(toInvite, sender.LoggedinUser, false);
+ }
+ break;
+ case PacketBuilder.SWFMODULE_ACCEPT:
+ if (packet.Length < 4)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid 2PLAYER ACCEPT Packet (WRONG SIZE)");
+ break;
+ }
+ packetStr = Encoding.UTF8.GetString(packet);
+ playerIdStr = packetStr.Substring(2, packetStr.Length - 4);
+ playerId = -1;
+ try
+ {
+ playerId = int.Parse(playerIdStr);
+ }
+ catch (Exception) { };
+
+ if (IsUserOnline(playerId))
+ {
+ User toAccept = GetUserById(playerId);
+ if(TwoPlayer.IsPlayerInvitingPlayer(toAccept, sender.LoggedinUser))
+ {
+ TwoPlayer twoPlayerGame = TwoPlayer.GetGameInvitingPlayer(toAccept, sender.LoggedinUser);
+ twoPlayerGame.Accept(sender.LoggedinUser);
+ }
+ }
+ break;
+ case PacketBuilder.SWFMODULE_DRAWINGROOM:
+ if(packet.Length < 3)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid DRAWINGROOM packet (swf communication, WRONG SIZE)");
+ break;
+ }
+ if(packet[2] == PacketBuilder.DRAWINGROOM_GET_DRAWING)
+ {
+ if (packet.Length < 6)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid DRAWINGROOM GET DRAWING packet (swf communication, WRONG SIZE)");
+ break;
+ }
+ int roomId = packet[3] - 40;
+ Drawingroom room;
+ try
+ {
+ room = Drawingroom.GetDrawingRoomById(roomId);
+ }
+ catch(KeyNotFoundException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to load an invalid drawing room: " + roomId);
+ break;
+ }
+
+ if(room.Drawing != "")
+ {
+ byte[] drawingPacket = PacketBuilder.CreateDrawingUpdatePacket(room.Drawing);
+ sender.SendPacket(drawingPacket);
+ }
+
+ }
+ else if(packet[2] == PacketBuilder.DRAWINGROOM_SAVE)
+ {
+ if (packet.Length < 5)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid DRAWINGROOM GET DRAWING packet (swf communication, WRONG SIZE)");
+ break;
+ }
+
+ /*
+ * The lack of an if case for if the user isnt subscribed
+ * is NOT a bug thats just how pinto does it.
+ * you can save but not load if your subscribed. weird huh?
+ */
+
+ int roomId = packet[3] - 40;
+ Drawingroom room;
+ try
+ {
+ room = Drawingroom.GetDrawingRoomById(roomId);
+ }
+ catch (KeyNotFoundException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to load an invalid drawing room: " + roomId);
+ break;
+ }
+
+ if (!Database.SavedDrawingsExist(sender.LoggedinUser.Id))
+ Database.CreateSavedDrawings(sender.LoggedinUser.Id);
+
+ int slotNo = 0;
+ byte slot = packet[4];
+ switch (slot)
+ {
+ case 0x29: // Slot 1
+ Database.SaveDrawingSlot1(sender.LoggedinUser.Id, room.Drawing);
+ slotNo = 1;
+ break;
+ case 0x2A: // Slot 2
+ Database.SaveDrawingSlot2(sender.LoggedinUser.Id, room.Drawing);
+ slotNo = 2;
+ break;
+ case 0x2B: // Slot 3
+ Database.SaveDrawingSlot3(sender.LoggedinUser.Id, room.Drawing);
+ slotNo = 3;
+ break;
+ }
+
+ byte[] savedDrawingMessage = PacketBuilder.CreateChat(Messages.FormatDrawingRoomSaved(slotNo), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(savedDrawingMessage);
+
+ break;
+ }
+ else if (packet[2] == PacketBuilder.DRAWINGROOM_LOAD)
+ {
+ if (packet.Length < 5)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid DRAWINGROOM GET DRAWING packet (swf communication, WRONG SIZE)");
+ break;
+ }
+
+ if(!sender.LoggedinUser.Subscribed)
+ {
+ byte[] notSubscribedCantLoad = PacketBuilder.CreateChat(Messages.DrawingCannotLoadNotSubscribed, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(notSubscribedCantLoad);
+ break;
+ }
+
+ int roomId = packet[3] - 40;
+ Drawingroom room;
+ try{
+ room = Drawingroom.GetDrawingRoomById(roomId);
+ }
+ catch (KeyNotFoundException){
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to load an invalid drawing room: " + roomId);
+ break;
+ }
+
+ if (!Database.SavedDrawingsExist(sender.LoggedinUser.Id))
+ Database.CreateSavedDrawings(sender.LoggedinUser.Id);
+
+ int slotNo = 0;
+ byte slot = packet[4];
+ string drawingToAdd = "";
+ switch (slot)
+ {
+ case 0x29: // Slot 1
+ drawingToAdd = Database.LoadDrawingSlot1(sender.LoggedinUser.Id);
+ slotNo = 1;
+ break;
+ case 0x2A: // Slot 2
+ drawingToAdd = Database.LoadDrawingSlot2(sender.LoggedinUser.Id);
+ slotNo = 2;
+ break;
+ case 0x2B: // Slot 3
+ drawingToAdd = Database.LoadDrawingSlot3(sender.LoggedinUser.Id);
+ slotNo = 3;
+ break;
+ }
+
+ try {
+ room.Drawing += drawingToAdd;
+ }
+ catch(DrawingroomFullException){
+ byte[] roomFullMessage = PacketBuilder.CreateChat(Messages.DrawingPlzClearLoad, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(roomFullMessage);
+ break;
+ }
+
+ Database.SetLastPlayer("D" + room.Id.ToString(), sender.LoggedinUser.Id);
+ UpdateDrawingForAll("D" + room.Id, sender, drawingToAdd, true);
+
+ byte[] loadedDrawingMessage = PacketBuilder.CreateChat(Messages.FormatDrawingRoomLoaded(slotNo), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(loadedDrawingMessage);
+
+ break;
+ }
+ else // Default action- draw line
+ {
+ if (packet.Length < 5)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid DRAWINGROOM GET DRAWING packet (swf communication, WRONG SIZE)");
+ break;
+ }
+
+ if(!sender.LoggedinUser.Subscribed)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to draw while not subscribed.");
+ byte[] notSubscribedMessage = PacketBuilder.CreateChat(Messages.DrawingNotSentNotSubscribed, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(notSubscribedMessage);
+ break;
+ }
+
+ int roomId = packet[2] - 40;
+ Drawingroom room;
+ try
+ {
+ room = Drawingroom.GetDrawingRoomById(roomId);
+ }
+ catch (KeyNotFoundException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to load an invalid drawing room: " + roomId);
+ break;
+ }
+
+ packetStr = Encoding.UTF8.GetString(packet);
+
+ string drawing = packetStr.Substring(3, packetStr.Length - 5);
+ if (drawing.Contains("X!")) // Clear byte
+ {
+ room.Drawing = "";
+ goto update;
+ }
+
+ try {
+ room.Drawing += drawing;
+ }
+ catch (DrawingroomFullException)
+ {
+ byte[] roomFullMessage = PacketBuilder.CreateChat(Messages.DrawingPlzClearDraw, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(roomFullMessage);
+ break;
+ }
+ update:;
+ Database.SetLastPlayer("D" + room.Id.ToString(), sender.LoggedinUser.Id);
+ UpdateDrawingForAll("D" + room.Id, sender, drawing, false);
+ }
+
+ break;
+ case PacketBuilder.SWFMODULE_BRICKPOET:
+ if(packet.Length < 5)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid BRICKPOET packet (swf communication, WRONG SIZE)");
+ break;
+ }
+ if(packet[2] == PacketBuilder.BRICKPOET_LIST_ALL)
+ {
+ if (packet.Length < 6)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid BRICKPOET LIST ALL packet (swf communication, WRONG SIZE)");
+ break;
+ }
+
+ int roomId = packet[3] - 40;
+ Brickpoet.PoetryPeice[] room;
+ try // Make sure the room exists-
+ {
+ room = Brickpoet.GetPoetryRoom(roomId);
+ }
+ catch(KeyNotFoundException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to load an invalid brickpoet room: " + roomId);
+ break;
+ }
+ // Send list of peices
+ byte[] poetPacket = PacketBuilder.CreateBrickPoetListPacket(room);
+ sender.SendPacket(poetPacket);
+
+ }
+ else if(packet[3] == PacketBuilder.BRICKPOET_MOVE)
+ {
+ if (packet.Length < 0xB)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid BRICKPOET MOVE packet (swf communication, WRONG SIZE)");
+ break;
+ }
+ packetStr = Encoding.UTF8.GetString(packet);
+ if(!packetStr.Contains('|'))
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid BRICKPOET MOVE packet (swf communication, NO | SEPERATOR)");
+ break;
+ }
+ string[] args = packetStr.Split('|');
+ if(args.Length < 5)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid BRICKPOET MOVE Packet (swf communication, NOT ENOUGH | SEPERATORS.");
+ break;
+ }
+
+ int roomId = packet[2] - 40;
+ int peiceId;
+ int x;
+ int y;
+ Brickpoet.PoetryPeice[] room;
+ Brickpoet.PoetryPeice peice;
+
+ try // Make sure these are acturally numbers!
+ {
+ peiceId = int.Parse(args[1]);
+ x = int.Parse(args[2]);
+ y = int.Parse(args[3]);
+
+
+ room = Brickpoet.GetPoetryRoom(roomId);
+ peice = Brickpoet.GetPoetryPeice(room, peiceId);
+
+ }
+ catch (Exception e)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " brickpoet - "+e.ToString());
+ break;
+ }
+ // Change location in Database
+ peice.X = x;
+ peice.Y = y;
+
+ foreach(User user in GetUsersOnSpecialTileCode("MULTIROOM-" + "P" + roomId.ToString())) // Send to each user!
+ {
+ if (user.Id == sender.LoggedinUser.Id)
+ continue;
+
+ byte[] updatePoetRoomPacket = PacketBuilder.CreateBrickPoetMovePacket(peice);
+ user.LoggedinClient.SendPacket(updatePoetRoomPacket);
+
+ }
+
+ if (Database.GetLastPlayer("P" + roomId) != sender.LoggedinUser.Id)
+ {
+ Database.SetLastPlayer("P" + roomId, sender.LoggedinUser.Id);
+ UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y, true);
+ }
+
+ break;
+ }
+ else
+ {
+ Logger.DebugPrint(" packet dump: " + BitConverter.ToString(packet).Replace("-", " "));
+ break;
+ }
+
+ break;
+ case PacketBuilder.SWFMODULE_DRESSUPROOM:
+ if (packet.Length < 6)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid DRESSUPROOM packet (swf communication, WRONG SIZE)");
+ break;
+ }
+ if (packet[2] == PacketBuilder.DRESSUPROOM_LIST_ALL)
+ {
+ int roomId = packet[3] - 40;
+ Dressup.DressupRoom room = Dressup.GetDressupRoom(roomId);
+
+ if (room.DressupPeices.Length > 0)
+ {
+ byte[] allDressupsResponse = PacketBuilder.CreateDressupRoomPeiceResponse(room.DressupPeices.ToArray());
+ sender.SendPacket(allDressupsResponse);
+ }
+
+ }
+ else // Move
+ {
+ if (packet.Length < 9)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid DRESSUPROOM MOVE packet (swf communication, WRONG SIZE)");
+ break;
+ }
+
+ int roomId = packet[2] - 40;
+ if (roomId <= 0)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid DRESSUPROOM MOVE packet (swf communication, INVALID ROOM)");
+ break;
+ }
+ Dressup.DressupRoom room = Dressup.GetDressupRoom(roomId);
+
+ packetStr = Encoding.UTF8.GetString(packet);
+ string moveStr = packetStr.Substring(3, packetStr.Length - 5);
+
+ string[] moves = moveStr.Split('|');
+
+ if(moves.Length < 3)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid DRESSUPROOM MOVE packet (swf communication, MOVES WRONG SIZE)");
+ break;
+ }
+
+ int peiceId;
+ double moveToX;
+ double moveToY;
+ bool active = true;
+ try // Make sure these are acturally numbers!
+ {
+ peiceId = int.Parse(moves[0]);
+ if (moves[1] == "D" || moves[2] == "D")
+ {
+ active = false;
+ moveToX = 0;
+ moveToY = 0;
+ }
+ else
+ {
+ moveToX = double.Parse(moves[1]);
+ moveToY = double.Parse(moves[2]);
+ }
+ }
+ catch(FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent invalid DRESSUPROOM MOVE packet (swf communication, INVALID LOCATION)");
+ break;
+ }
+
+ Dressup.DressupPeice peice = room.GetDressupPeice(peiceId);
+ // Update database entries
+ peice.X = Convert.ToInt32(Math.Round(moveToX));
+ peice.Y = Convert.ToInt32(Math.Round(moveToY));
+ peice.Active = active;
+
+ // Forward to other users
+ byte[] movePeicePacket = PacketBuilder.CreateDressupRoomPeiceMove(peice.PeiceId, moveToX, moveToY, peice.Active);
+ User[] users = GetUsersAt(sender.LoggedinUser.X, sender.LoggedinUser.Y, true, true);
+ foreach(User user in users)
+ {
+ if (user.Id != sender.LoggedinUser.Id)
+ user.LoggedinClient.SendPacket(movePeicePacket);
+ }
+ }
+ break;
+ case PacketBuilder.SWFMODULE_BANDHALL:
+ byte[] response = PacketBuilder.CreateForwardedSwfRequest(packet);
+ foreach (User user in GetUsersAt(sender.LoggedinUser.X, sender.LoggedinUser.Y))
+ {
+ if (user.Id == sender.LoggedinUser.Id)
+ continue;
+ user.LoggedinClient.SendPacket(response);
+ }
+ break;
+ case PacketBuilder.SWFMODULE_2PLAYER:
+ if(TwoPlayer.IsPlayerInGame(sender.LoggedinUser))
+ {
+ TwoPlayer twoPlayerGame = TwoPlayer.GetTwoPlayerGameInProgress(sender.LoggedinUser);
+
+ User otherUser = null;
+ if (twoPlayerGame.Invitee.Id == sender.LoggedinUser.Id)
+ otherUser = twoPlayerGame.Inviting;
+ else if (twoPlayerGame.Inviting.Id == sender.LoggedinUser.Id)
+ otherUser = twoPlayerGame.Invitee;
+
+ response = PacketBuilder.CreateForwardedSwfRequest(packet);
+ otherUser.LoggedinClient.SendPacket(response);
+ }
+ break;
+ case PacketBuilder.SWFMODULE_CLOSE:
+ if (TwoPlayer.IsPlayerInGame(sender.LoggedinUser))
+ {
+ TwoPlayer twoPlayerGame = TwoPlayer.GetTwoPlayerGameInProgress(sender.LoggedinUser);
+
+ User otherUser = null;
+ if (twoPlayerGame.Invitee.Id == sender.LoggedinUser.Id)
+ otherUser = twoPlayerGame.Inviting;
+ else if (twoPlayerGame.Inviting.Id == sender.LoggedinUser.Id)
+ otherUser = twoPlayerGame.Invitee;
+
+ response = PacketBuilder.Create2PlayerClose();
+ otherUser.LoggedinClient.SendPacket(response);
+
+ twoPlayerGame.CloseGame(sender.LoggedinUser);
+
+
+ }
+ break;
+ case PacketBuilder.SWFMODULE_ARENA:
+ if (Arena.UserHasEnteredHorseInAnyArena(sender.LoggedinUser))
+ {
+ Arena arena = Arena.GetArenaUserEnteredIn(sender.LoggedinUser);
+ response = PacketBuilder.CreateForwardedSwfRequest(packet);
+ foreach (Arena.ArenaEntry entry in arena.Entries.ToArray())
+ {
+ if (entry.EnteredUser.Id == sender.LoggedinUser.Id)
+ continue;
+ if(entry.EnteredUser.LoggedinClient.LoggedIn)
+ entry.EnteredUser.LoggedinClient.SendPacket(response);
+ }
+
+ }
+ break;
+ default:
+ Logger.DebugPrint("Unknown moduleid : " + module + " packet dump: " + BitConverter.ToString(packet).Replace("-"," "));
+ break;
+
+ }
+
+ }
+
+ public static void OnWish(GameClient sender, byte[] packet)
+ {
+ if (!sender.LoggedIn)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " tried to wish when not logged in.");
+ return;
+ }
+
+ if(packet.Length < 4)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid wish Packet");
+ return;
+ }
+
+ if (!sender.LoggedinUser.Inventory.HasItemId(Item.WishingCoin))
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to use a wishing well while having 0 coins.");
+ return;
+ }
+
+ InventoryItem wishingCoinInvItems = sender.LoggedinUser.Inventory.GetItemByItemId(Item.WishingCoin);
+ byte wishType = packet[1];
+ string message = "";
+
+ byte[] chatMsg = PacketBuilder.CreateChat(Messages.TossedCoin, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatMsg);
+
+ switch(wishType)
+ {
+ case PacketBuilder.WISH_MONEY:
+ int gainMoney = RandomNumberGenerator.Next(500, 1000);
+ sender.LoggedinUser.AddMoney(gainMoney);
+ message = Messages.FormatWishMoneyMessage(gainMoney);
+ break;
+ case PacketBuilder.WISH_ITEMS:
+ Item.ItemInformation[] wishableItmes = Item.GetAllWishableItems();
+ int item = RandomNumberGenerator.Next(0, wishableItmes.Length);
+ Item.ItemInformation itm = wishableItmes[item];
+ item = RandomNumberGenerator.Next(0, wishableItmes.Length);
+ Item.ItemInformation itm2 = wishableItmes[item];
+
+ sender.LoggedinUser.Inventory.AddIgnoringFull(new ItemInstance(itm.Id));
+ sender.LoggedinUser.Inventory.AddIgnoringFull(new ItemInstance(itm2.Id));
+
+ message = Messages.FormatWishThingsMessage(itm.Name, itm2.Name);
+ break;
+ case PacketBuilder.WISH_WORLDPEACE:
+ byte[] tooDeep = PacketBuilder.CreateChat(Messages.WorldPeaceOnlySoDeep, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(tooDeep);
+
+ wishableItmes = Item.GetAllWishableItems();
+ item = RandomNumberGenerator.Next(0, wishableItmes.Length);
+ int earnMoney = RandomNumberGenerator.Next(0, 500);
+ itm = wishableItmes[item];
+
+
+ sender.LoggedinUser.AddMoney(earnMoney);
+ sender.LoggedinUser.Inventory.AddIgnoringFull(new ItemInstance(itm.Id));
+
+ message = Messages.FormatWishWorldPeaceMessage(earnMoney, itm.Name);
+ break;
+ default:
+ Logger.ErrorPrint("Unknnown Wish type: " + wishType.ToString("X"));
+ break;
+ }
+ sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.WishingWell).Count++;
+
+ if(sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.WishingWell).Count >= 100)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(30)); // Well Wisher
+
+ if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.WishingWell).Count >= 1000)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(31)); // Star Wisher
+
+ if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.WishingWell).Count >= 10000)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(51)); // Extraordanary Wisher
+
+ byte[] msg = PacketBuilder.CreateChat(message, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(msg);
+
+ sender.LoggedinUser.Inventory.Remove(wishingCoinInvItems.ItemInstances[0]);
+ UpdateArea(sender);
+ }
+ public static void OnKeepAlive(GameClient sender, byte[] packet)
+ {
+ if (packet.Length < 2)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid update Packet");
+ return;
+ }
+
+ if (packet[1] == PacketBuilder.PACKET_CLIENT_TERMINATOR)
+ {
+ Logger.DebugPrint("Received KEEP_ALIVE from: " + sender.LoggedinUser.Username);
+ return;
+ }
+ }
+ public static void OnStatsPacket(GameClient sender, byte[] packet)
+ {
+ if(!sender.LoggedIn)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " Requested stats when not logged in.");
+ return;
+ }
+ if(packet.Length < 3)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + "Sent an invalid Stats Packet");
+ return;
+ }
+
+
+ }
+ public static void OnProfilePacket(GameClient sender, byte[] packet)
+ {
+ if (!sender.LoggedIn)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " Requested to change profile page when not logged in.");
+ return;
+ }
+ if (packet.Length < 2)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid Profile Packet");
+ return;
+ }
+
+ byte method = packet[1];
+ if (method == PacketBuilder.PACKET_CLIENT_TERMINATOR)
+ {
+ UpdateStats(sender);
+ }
+ if (method == PacketBuilder.VIEW_PROFILE)
+ {
+ sender.LoggedinUser.MajorPriority = true;
+ string profilePage = sender.LoggedinUser.ProfilePage;
+ byte[] profilePacket = PacketBuilder.CreateProfilePacket(profilePage);
+ sender.SendPacket(profilePacket);
+ }
+ else if (method == PacketBuilder.SAVE_PROFILE)
+ {
+
+ string packetStr = Encoding.UTF8.GetString(packet);
+ if (packet.Length < 3 || !packetStr.Contains('|'))
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid Profile SAVE Packet");
+ return;
+ }
+
+ int characterId = (packet[2] - 20) * 64 + (packet[3] - 20);
+
+ string profilePage = packetStr.Split('|')[1];
+ profilePage = profilePage.Substring(0, profilePage.Length - 2);
+ sender.LoggedinUser.CharacterId = characterId;
+
+
+
+ if (profilePage.Length > 4000)
+ {
+ byte[] notSaved = PacketBuilder.CreateChat(Messages.ProfileTooLongMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(notSaved);
+ return;
+ }
+
+ object filterReason = Chat.FilterMessage(profilePage);
+ if(filterReason != null)
+ {
+ Chat.Reason reason = (Chat.Reason)filterReason;
+ byte[] msg = PacketBuilder.CreateChat(Messages.FormatProfileSavedBlocked(reason.Message), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(msg);
+ return;
+ }
+
+ sender.LoggedinUser.ProfilePage = profilePage;
+
+ Logger.DebugPrint(sender.LoggedinUser.Username + " Changed to character id: " + characterId + " and set there Profile Description to '" + profilePage + "'");
+
+ byte[] chatPacket = PacketBuilder.CreateChat(Messages.ProfileSavedMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatPacket);
+
+ UpdateArea(sender);
+ UpdateUserFacingAndLocation(sender.LoggedinUser);
+ }
+ else if (method == PacketBuilder.SECCODE_AWARD)
+ {
+ byte[] ExpectedSecCode = sender.LoggedinUser.GenerateSecCode();
+ byte[] GotSecCode = new byte[4];
+ Array.ConstrainedCopy(packet, 2, GotSecCode, 0, GotSecCode.Length);
+ Logger.DebugPrint(sender.LoggedinUser.Username + " Sent sec code: " + BitConverter.ToString(GotSecCode).Replace("-", " "));
+ if (ExpectedSecCode.SequenceEqual(GotSecCode))
+ {
+ if (packet.Length < 6)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent a seccode AWARD request with invalid size");
+ return;
+ }
+
+ string packetStr = Encoding.UTF8.GetString(packet);
+ string awardIdStr = packetStr.Substring(6, packetStr.Length - 6 - 2);
+
+ int value = -1;
+ try
+ {
+ value = int.Parse(awardIdStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent correct sec code, but invalid awardid value");
+ return;
+ }
+
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(value));
+ return;
+ }
+ else
+ {
+ byte[] errorMessage = PacketBuilder.CreateChat(Messages.InvalidSecCodeError, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(errorMessage);
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Sent invalid sec code");
+ return;
+ }
+ }
+ else if (method == PacketBuilder.SECCODE_SCORE || method == PacketBuilder.SECCODE_TIME || method == PacketBuilder.SECCODE_WINLOOSE)
+ {
+ bool time = (method == PacketBuilder.SECCODE_TIME);
+ bool winloose = (method == PacketBuilder.SECCODE_WINLOOSE);
+
+ byte[] ExpectedSecCode = sender.LoggedinUser.GenerateSecCode();
+ byte[] GotSecCode = new byte[4];
+ Array.ConstrainedCopy(packet, 2, GotSecCode, 0, GotSecCode.Length);
+ Logger.DebugPrint(sender.LoggedinUser.Username + " Sent sec code: " + BitConverter.ToString(GotSecCode).Replace("-", " "));
+ if (ExpectedSecCode.SequenceEqual(GotSecCode))
+ {
+ if (packet.Length < 6)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent a seccode score/time/winloose request with invalid size");
+ return;
+ }
+
+
+ string packetStr = Encoding.UTF8.GetString(packet);
+ string gameInfoStr = packetStr.Substring(6, packetStr.Length - 6 - 2);
+ if (winloose)
+ {
+ string gameTitle = gameInfoStr.Substring(1);
+ byte pmethod = packet[6];
+ if(pmethod == PacketBuilder.WINLOOSE_WIN)
+ {
+ sender.LoggedinUser.Highscores.Win(gameTitle);
+ byte[] winMsg = PacketBuilder.CreateChat(Messages.Format2PlayerRecordWin(gameTitle), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(winMsg);
+ }
+ else if(pmethod == PacketBuilder.WINLOOSE_LOOSE)
+ {
+ sender.LoggedinUser.Highscores.Loose(gameTitle);
+ byte[] looseMsg = PacketBuilder.CreateChat(Messages.Format2PlayerRecordLose(gameTitle), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(looseMsg);
+ }
+
+ if (sender.LoggedinUser.Highscores.HighscoreList.Length >= 30)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(12)); // Minigame Player
+
+ if (sender.LoggedinUser.Highscores.HighscoreList.Length >= 60)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(13)); // Minigame Master
+
+ if (Database.GetPlayerTotalMinigamesPlayed(sender.LoggedinUser.Id) >= 1000)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(14)); // Minigame Nut
+
+ if (Database.GetPlayerTotalMinigamesPlayed(sender.LoggedinUser.Id) >= 10000)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(15)); // Minigame Crazy
+ return;
+ }
+ if (gameInfoStr.Contains("|"))
+ {
+ string[] gameInfo = gameInfoStr.Split('|');
+ if (gameInfo.Length < 2)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent a invalid seccode score request");
+ return;
+ }
+
+ string gameTitle = gameInfo[0];
+ string gameScoreStr = gameInfo[1];
+
+ int value = -1;
+ try
+ {
+ value = int.Parse(gameScoreStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent correct sec code, but invalid score value");
+ return;
+ }
+ Highscore.HighscoreTableEntry[] scores = Database.GetTopScores(gameTitle, 5, !time);
+ bool bestScoreEver = false;
+ if (scores.Length >= 1)
+ bestScoreEver = scores[0].Score <= value;
+
+ bool newHighscore = sender.LoggedinUser.Highscores.UpdateHighscore(gameTitle, value, time);
+ if(bestScoreEver && !time)
+ {
+ byte[] bestScoreBeaten = PacketBuilder.CreateChat(Messages.BeatBestHighscore, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(bestScoreBeaten);
+ sender.LoggedinUser.AddMoney(2500);
+ }
+ else if (newHighscore)
+ {
+ if(time)
+ {
+ byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatTimeBeatenMessage(value), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatPacket);
+ }
+ else
+ {
+ byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatHighscoreBeatenMessage(value), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatPacket);
+ }
+
+ }
+
+ if(sender.LoggedinUser.Highscores.HighscoreList.Length >= 30)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(12)); // Minigame Player
+
+ if (sender.LoggedinUser.Highscores.HighscoreList.Length >= 60)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(13)); // Minigame Master
+
+ if (Database.GetPlayerTotalMinigamesPlayed(sender.LoggedinUser.Id) >= 1000)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(14)); // Minigame Nut
+
+ if (Database.GetPlayerTotalMinigamesPlayed(sender.LoggedinUser.Id) >= 10000)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(15)); // Minigame Crazy
+
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " didnt send a game name AND a score.");
+ return;
+ }
+
+ }
+ else
+ {
+ byte[] errorMessage = PacketBuilder.CreateChat(Messages.InvalidSecCodeError, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(errorMessage);
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Sent invalid sec code");
+ return;
+ }
+ }
+ else if (method == PacketBuilder.SECCODE_MONEY)
+ {
+
+ byte[] ExpectedSecCode = sender.LoggedinUser.GenerateSecCode();
+ byte[] GotSecCode = new byte[4];
+ Array.ConstrainedCopy(packet, 2, GotSecCode, 0, GotSecCode.Length);
+ Logger.DebugPrint(sender.LoggedinUser.Username + " Sent sec code: " + BitConverter.ToString(GotSecCode).Replace("-", " "));
+ if (ExpectedSecCode.SequenceEqual(GotSecCode))
+ {
+ if (packet.Length < 6)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent a seccode money request with invalid size");
+ return;
+ }
+
+ string packetStr = Encoding.UTF8.GetString(packet);
+ string gameInfoStr = packetStr.Substring(6, packetStr.Length - 6 - 2);
+ if (gameInfoStr.Contains("|"))
+ {
+ string[] moneyInfo = gameInfoStr.Split('|');
+ if (moneyInfo.Length < 2)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent a invalid money score request");
+ return;
+ }
+
+ string id = moneyInfo[0]; // not sure what this is for?
+
+ string moneyStr = moneyInfo[1];
+ int value = -1;
+ try
+ {
+ value = int.Parse(moneyStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent correct sec code, but invalid money value");
+ return;
+ }
+
+ int moneyEarned = value * 10;
+ Logger.InfoPrint(sender.LoggedinUser.Username + " Earned $" + moneyEarned + " In: " + id);
+
+ sender.LoggedinUser.AddMoney(moneyEarned);
+ byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatMoneyEarnedMessage(moneyEarned), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatPacket);
+
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " didnt send a game name AND a score.");
+ return;
+ }
+
+ }
+ }
+ else if (method == PacketBuilder.SECCODE_GIVE_ITEM)
+ {
+ byte[] ExpectedSecCode = sender.LoggedinUser.GenerateSecCode();
+ byte[] GotSecCode = new byte[4];
+ Array.ConstrainedCopy(packet, 2, GotSecCode, 0, GotSecCode.Length);
+ Logger.DebugPrint(sender.LoggedinUser.Username + " Sent sec code: " + BitConverter.ToString(GotSecCode).Replace("-", " "));
+ if (ExpectedSecCode.SequenceEqual(GotSecCode))
+ {
+ if (packet.Length < 6)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent a seccode item request with invalid size");
+ return;
+ }
+ string packetStr = Encoding.UTF8.GetString(packet);
+ string intStr = packetStr.Substring(6, packetStr.Length - 6 - 2);
+ int value = -1;
+ try
+ {
+ value = int.Parse(intStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent correct sec code, but invalid value");
+ return;
+ }
+
+
+ if (Item.ItemIdExist(value))
+ {
+ ItemInstance itm = new ItemInstance(value);
+
+ Item.ItemInformation itemInfo = Item.GetItemById(value);
+ string messageToSend = Messages.FormatYouEarnedAnItemMessage(itemInfo.Name);
+ try
+ {
+ sender.LoggedinUser.Inventory.Add(itm);
+ }
+ catch(InventoryException)
+ {
+ messageToSend = Messages.FormatYouEarnedAnItemButInventoryFullMessage(itemInfo.Name);
+ }
+
+ byte[] earnedItemMessage = PacketBuilder.CreateChat(messageToSend, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(earnedItemMessage);
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Sent correct sec code, but tried to give an non existant item");
+ return;
+ }
+
+ }
+ else
+ {
+ byte[] errorMessage = PacketBuilder.CreateChat(Messages.InvalidSecCodeError, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(errorMessage);
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Sent invalid sec code");
+ return;
+ }
+ }
+ else if (method == PacketBuilder.SECCODE_DELETE_ITEM)
+ {
+ byte[] ExpectedSecCode = sender.LoggedinUser.GenerateSecCode();
+ byte[] GotSecCode = new byte[4];
+ Array.ConstrainedCopy(packet, 2, GotSecCode, 0, GotSecCode.Length);
+ Logger.DebugPrint(sender.LoggedinUser.Username + " Sent sec code: " + BitConverter.ToString(GotSecCode).Replace("-", " "));
+ if (ExpectedSecCode.SequenceEqual(GotSecCode))
+ {
+ if (packet.Length < 6)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent a seccode item request with invalid size");
+ return;
+ }
+ string packetStr = Encoding.UTF8.GetString(packet);
+ string intStr = packetStr.Substring(6, packetStr.Length - 6 - 2);
+ int value = -1;
+ try
+ {
+ value = int.Parse(intStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent correct sec code, but invalid value");
+ return;
+ }
+
+
+ if (sender.LoggedinUser.Inventory.HasItemId(value))
+ {
+ InventoryItem item = sender.LoggedinUser.Inventory.GetItemByItemId(value);
+ sender.LoggedinUser.Inventory.Remove(item.ItemInstances[0]);
+
+ Item.ItemInformation itemInfo = Item.GetItemById(value);
+ byte[] lostItemMessage = PacketBuilder.CreateChat(Messages.FormatYouLostAnItemMessage(itemInfo.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(lostItemMessage);
+
+ UpdateArea(sender);
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Sent correct sec code, but tried to delete an non existant item");
+ return;
+ }
+
+ }
+ else
+ {
+ byte[] errorMessage = PacketBuilder.CreateChat(Messages.InvalidSecCodeError, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(errorMessage);
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Sent invalid sec code");
+ return;
+ }
+ }
+ else if (method == PacketBuilder.SECCODE_QUEST)
+ {
+ byte[] ExpectedSecCode = sender.LoggedinUser.GenerateSecCode();
+ byte[] GotSecCode = new byte[4];
+ Array.ConstrainedCopy(packet, 2, GotSecCode, 0, GotSecCode.Length);
+ Logger.DebugPrint(sender.LoggedinUser.Username + " Sent sec code: " + BitConverter.ToString(GotSecCode).Replace("-", " "));
+ if (ExpectedSecCode.SequenceEqual(GotSecCode))
+ {
+ if (packet.Length < 6)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent a seccode quest request with invalid size");
+ return;
+ }
+ string packetStr = Encoding.UTF8.GetString(packet);
+ string intStr = packetStr.Substring(6, packetStr.Length - 6 - 2);
+ int value = -1;
+ try
+ {
+ value = int.Parse(intStr);
+ }
+ catch (FormatException)
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Sent correct sec code, but invalid value");
+ return;
+ }
+
+
+ if (Quest.DoesQuestExist(value))
+ {
+ Quest.QuestEntry questEntry = Quest.GetQuestById(value);
+ Quest.ActivateQuest(sender.LoggedinUser, questEntry);
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Sent correct sec code, but tried to activate a non existant quest");
+ return;
+ }
+
+
+ }
+ else
+ {
+ byte[] errorMessage = PacketBuilder.CreateChat(Messages.InvalidSecCodeError, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(errorMessage);
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Sent invalid sec code");
+ return;
+ }
+ }
+ else if (method == PacketBuilder.PROFILE_HIGHSCORES_LIST)
+ {
+ sender.LoggedinUser.MajorPriority = true;
+ string packetStr = Encoding.UTF8.GetString(packet);
+ string gameName = packetStr.Substring(2, packetStr.Length - 4);
+ byte[] metaTag = PacketBuilder.CreateMetaPacket(Meta.BuildTopHighscores(gameName));
+ sender.SendPacket(metaTag);
+ }
+ else if (method == PacketBuilder.PROFILE_BESTTIMES_LIST)
+ {
+ sender.LoggedinUser.MajorPriority = true;
+ string packetStr = Encoding.UTF8.GetString(packet);
+ string gameName = packetStr.Substring(2, packetStr.Length - 4);
+ byte[] metaTag = PacketBuilder.CreateMetaPacket(Meta.BuildTopTimes(gameName));
+ sender.SendPacket(metaTag);
+ }
+ else if (method == PacketBuilder.PROFILE_WINLOOSE_LIST)
+ {
+ sender.LoggedinUser.MajorPriority = true;
+ string packetStr = Encoding.UTF8.GetString(packet);
+ string gameName = packetStr.Substring(2, packetStr.Length - 4);
+ byte[] metaTag = PacketBuilder.CreateMetaPacket(Meta.BuildTopWinners(gameName));
+ sender.SendPacket(metaTag);
+ }
+ else
+ {
+ Logger.DebugPrint("Unknown Profile Packet! " + BitConverter.ToString(packet).Replace("-", " "));
+ }
+ }
+ public static void OnMovementPacket(GameClient sender, byte[] packet)
+ {
+ if (!sender.LoggedIn)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " Sent movement packet when not logged in.");
+ return;
+ }
+
+
+ User loggedInUser = sender.LoggedinUser;
+
+ /*
+ * Player stuff
+ */
+
+ // Store this for later... do it now to avoid TOCTOU.
+ User[] onScreenBefore = GetOnScreenUsers(loggedInUser.X, loggedInUser.Y, true, true);
+
+ // Leave Multirooms
+ Multiroom.LeaveAllMultirooms(loggedInUser);
+
+ loggedInUser.PendingBuddyRequestTo = null;
+
+ // Close Social Windows
+ foreach (User sUser in loggedInUser.BeingSocializedBy)
+ UpdateArea(sUser.LoggedinClient);
+ loggedInUser.ClearSocailizedWith();
+
+
+ if (loggedInUser.CurrentlyRidingHorse != null)
+ {
+ if(loggedInUser.CurrentlyRidingHorse.BasicStats.Experience < 25)
+ {
+ if(GameServer.RandomNumberGenerator.Next(0, 100) >= 97 || sender.LoggedinUser.Username.ToLower() == "dream")
+ {
+ loggedInUser.CurrentlyRidingHorse.BasicStats.Experience++;
+ byte[] horseBuckedMessage;
+ if(loggedInUser.CurrentlyRidingHorse.Breed.Type == "llama")
+ horseBuckedMessage = PacketBuilder.CreateChat(Messages.HorseLlamaBuckedYou, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ else if (loggedInUser.CurrentlyRidingHorse.Breed.Type == "camel")
+ horseBuckedMessage = PacketBuilder.CreateChat(Messages.HorseCamelBuckedYou, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ else
+ horseBuckedMessage = PacketBuilder.CreateChat(Messages.HorseBuckedYou, PacketBuilder.CHAT_BOTTOM_RIGHT);
+
+ sender.LoggedinUser.CurrentlyRidingHorse = null;
+ sender.LoggedinUser.Facing %= 5;
+ sender.SendPacket(horseBuckedMessage);
+ }
+ }
+ }
+
+ // Randomly move if thirst, hunger, tiredness too low-
+
+ byte movementDirection = packet[1];
+
+ if (loggedInUser.Thirst <= 0 || loggedInUser.Hunger <= 0 || loggedInUser.Tiredness <= 0)
+ {
+ if (RandomNumberGenerator.Next(0, 10) == 7)
+ {
+ byte[] possibleDirections = new byte[] { PacketBuilder.MOVE_UP, PacketBuilder.MOVE_DOWN, PacketBuilder.MOVE_RIGHT, PacketBuilder.MOVE_LEFT };
+
+ if (possibleDirections.Contains(movementDirection))
+ {
+ byte newDirection = possibleDirections[RandomNumberGenerator.Next(0, possibleDirections.Length)];
+ if (newDirection != movementDirection)
+ {
+ movementDirection = newDirection;
+ if (loggedInUser.Thirst <= 0)
+ {
+ byte[] chatMessage = PacketBuilder.CreateChat(Messages.FormatRandomMovementMessage(Messages.StatThirst.ToUpper(), Messages.StatThirstDizzy), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatMessage);
+ }
+ else if (loggedInUser.Hunger <= 0)
+ {
+ byte[] chatMessage = PacketBuilder.CreateChat(Messages.FormatRandomMovementMessage(Messages.StatHunger.ToUpper(), Messages.StatHungerStumble), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatMessage);
+ }
+ /*
+ * Doesnt appear to acturally exist.
+ *
+ else if (loggedInUser.Tiredness <= 0)
+ {
+ byte[] chatMessage = PacketBuilder.CreateChat(Messages.FormatRandomMovementMessage(Messages.StatTired.ToUpper()), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatMessage);
+ }
+ */
+ }
+ }
+ }
+ }
+
+
+
+ int onHorse = 0;
+ int facing = sender.LoggedinUser.Facing;
+ while (facing >= 5)
+ {
+ facing -= 5;
+ onHorse++;
+ }
+ byte direction = 0;
+ int newX = loggedInUser.X;
+ int newY = loggedInUser.Y;
+
+
+ bool moveTwo = false;
+
+ if (movementDirection == PacketBuilder.MOVE_ESCAPE) // Exit this place / X Button
+ {
+
+ byte Direction;
+ if (World.InSpecialTile(loggedInUser.X, loggedInUser.Y))
+ {
+
+ World.SpecialTile tile = World.GetSpecialTile(loggedInUser.X, loggedInUser.Y);
+ if (tile.ExitX != 0)
+ newX = tile.ExitX;
+ if (tile.ExitY != 0)
+ newY = tile.ExitY;
+ else
+ if (Map.CheckPassable(loggedInUser.X, loggedInUser.Y + 1) || loggedInUser.NoClip)
+ newY += 1;
+
+
+
+ if (loggedInUser.X + 1 == newX && loggedInUser.Y == newY)
+ Direction = PacketBuilder.DIRECTION_RIGHT;
+ else if (loggedInUser.X - 1 == newX && loggedInUser.Y == newY)
+ Direction = PacketBuilder.DIRECTION_LEFT;
+ else if (loggedInUser.Y + 1 == newY && loggedInUser.X == newX)
+ Direction = PacketBuilder.DIRECTION_DOWN;
+ else if (loggedInUser.Y - 1 == newY && loggedInUser.X == newX)
+ Direction = PacketBuilder.DIRECTION_UP;
+ else
+ Direction = PacketBuilder.DIRECTION_TELEPORT;
+
+ loggedInUser.X = newX;
+ loggedInUser.Y = newY;
+
+
+ }
+ else
+ {
+ if (Map.CheckPassable(loggedInUser.X, loggedInUser.Y + 1) || loggedInUser.NoClip)
+ loggedInUser.Y += 1;
+
+ Direction = PacketBuilder.DIRECTION_DOWN;
+ }
+
+ loggedInUser.Facing = Direction + (onHorse * 5);
+ Logger.DebugPrint("Exiting player: " + loggedInUser.Username + " to: " + loggedInUser.X + "," + loggedInUser.Y);
+ byte[] moveResponse = PacketBuilder.CreateMovementPacket(loggedInUser.X, loggedInUser.Y, loggedInUser.CharacterId, loggedInUser.Facing, Direction, true);
+ sender.SendPacket(moveResponse);
+ goto Complete;
+ }
+
+ if (movementDirection == PacketBuilder.MOVE_UP)
+ {
+ direction = PacketBuilder.DIRECTION_UP;
+ if (Map.CheckPassable(newX, newY - 1) || loggedInUser.NoClip)
+ newY -= 1;
+
+
+ if (loggedInUser.Facing == (direction + (onHorse * 5)) && loggedInUser.CurrentlyRidingHorse != null && !World.InTown(loggedInUser.X, loggedInUser.Y)) // Double move
+ if (Map.CheckPassable(newX, newY - 1) || loggedInUser.NoClip)
+ {
+ newY -= 1;
+ moveTwo = true;
+ }
+ }
+ else if (movementDirection == PacketBuilder.MOVE_LEFT)
+ {
+ direction = PacketBuilder.DIRECTION_LEFT;
+ if (Map.CheckPassable(newX - 1, newY) || loggedInUser.NoClip)
+ newX -= 1;
+
+
+ if (loggedInUser.Facing == (direction + (onHorse * 5)) && loggedInUser.CurrentlyRidingHorse != null && !World.InTown(loggedInUser.X, loggedInUser.Y)) // Double move
+ if (Map.CheckPassable(newX - 1, newY) || loggedInUser.NoClip)
+ {
+ newX -= 1;
+ moveTwo = true;
+ }
+ }
+ else if (movementDirection == PacketBuilder.MOVE_RIGHT)
+ {
+ direction = PacketBuilder.DIRECTION_RIGHT;
+ if (Map.CheckPassable(newX + 1, newY) || loggedInUser.NoClip)
+ newX += 1;
+
+
+ if (loggedInUser.Facing == (direction + (onHorse * 5)) && loggedInUser.CurrentlyRidingHorse != null && !World.InTown(loggedInUser.X, loggedInUser.Y)) // Double move
+ if (Map.CheckPassable(newX + 1, newY) || loggedInUser.NoClip)
+ {
+ newX += 1;
+ moveTwo = true;
+ }
+ }
+ else if (movementDirection == PacketBuilder.MOVE_DOWN)
+ {
+ direction = PacketBuilder.DIRECTION_DOWN;
+ if (Map.CheckPassable(newX, newY + 1) || loggedInUser.NoClip)
+ newY += 1;
+
+
+ if (loggedInUser.Facing == (direction + (onHorse * 5)) && loggedInUser.CurrentlyRidingHorse != null && !World.InTown(loggedInUser.X, loggedInUser.Y)) // Double move
+ if (Map.CheckPassable(newX, newY + 1) || loggedInUser.NoClip)
+ {
+ newY += 1;
+ moveTwo = true;
+ }
+ }
+ else if(movementDirection == PacketBuilder.MOVE_UPDATE)
+ {
+ UpdateArea(sender);
+ return;
+ }
+
+
+
+ loggedInUser.Facing = direction + (onHorse * 5);
+ if (loggedInUser.Y != newY || loggedInUser.X != newX)
+ {
+ if (moveTwo)
+ direction += 20;
+
+ loggedInUser.Y = newY;
+ loggedInUser.X = newX;
+
+ // Check Treasures
+ if (Treasure.IsTileTreasure(loggedInUser.X, loggedInUser.Y))
+ {
+ Treasure treasure = Treasure.GetTreasureAt(loggedInUser.X, loggedInUser.Y);
+ if (treasure.Type == "RAINBOW")
+ {
+ treasure.CollectTreasure(loggedInUser);
+ goto Complete;
+ }
+ }
+
+ byte[] moveResponse = PacketBuilder.CreateMovementPacket(loggedInUser.X, loggedInUser.Y, loggedInUser.CharacterId, loggedInUser.Facing, direction, true);
+ sender.SendPacket(moveResponse);
+ }
+ else
+ {
+ byte[] moveResponse = PacketBuilder.CreateMovementPacket(loggedInUser.X, loggedInUser.Y, loggedInUser.CharacterId, loggedInUser.Facing, PacketBuilder.DIRECTION_NONE, false);
+ sender.SendPacket(moveResponse);
+ }
+ Complete:;
+
+ // Cancel Trades
+ if (loggedInUser.TradingWith != null)
+ if ((loggedInUser.TradingWith.Trader.X != loggedInUser.X) && (loggedInUser.TradingWith.Trader.Y != loggedInUser.Y))
+ loggedInUser.TradingWith.CancelTradeMoved();
+
+ // Pac-man the world.
+ if (loggedInUser.X > Map.Width)
+ loggedInUser.Teleport(2, loggedInUser.Y);
+ else if (loggedInUser.X < 2)
+ loggedInUser.Teleport(Map.Width - 2, loggedInUser.Y);
+ else if (loggedInUser.Y > Map.Height - 2)
+ loggedInUser.Teleport(loggedInUser.X, 2);
+ else if (loggedInUser.Y < 2)
+ loggedInUser.Teleport(loggedInUser.X, Map.Height - 2);
+
+
+ User[] onScreenNow = GetOnScreenUsers(loggedInUser.X, loggedInUser.Y, true, true);
+
+ User[] goneOffScreen = onScreenBefore.Except(onScreenNow).ToArray();
+ User[] goneOnScreen = onScreenNow.Except(onScreenBefore).ToArray();
+
+ foreach (User offScreenUsers in goneOffScreen)
+ {
+ if (offScreenUsers.Id == loggedInUser.Id)
+ continue;
+
+ byte[] playerInfoBytes = PacketBuilder.CreatePlayerInfoUpdateOrCreate(1000 + 4, 1000 + 1, loggedInUser.Facing, loggedInUser.CharacterId, loggedInUser.Username);
+ offScreenUsers.LoggedinClient.SendPacket(playerInfoBytes);
+ }
+
+ foreach (User onScreenUsers in goneOnScreen)
+ {
+ if (onScreenUsers.Id == loggedInUser.Id)
+ continue;
+
+ byte[] playerInfoBytes = PacketBuilder.CreatePlayerInfoUpdateOrCreate(onScreenUsers.X, onScreenUsers.Y, onScreenUsers.Facing, onScreenUsers.CharacterId, onScreenUsers.Username);
+ loggedInUser.LoggedinClient.SendPacket(playerInfoBytes);
+ }
+
+ Update(sender);
+
+ }
+ public static void OnQuitPacket(GameClient sender, byte[] packet)
+ {
+ if(!sender.LoggedIn)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " Sent quit packet when not logged in.");
+ return;
+ }
+ Logger.InfoPrint(sender.LoggedinUser.Username + " Clicked \"Quit Game\".. Disconnecting");
+ sender.Disconnect();
+ }
+ public static void OnNpcInteraction(GameClient sender, byte[] packet)
+ {
+ if (!sender.LoggedIn)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " Sent npc interaction packet when not logged in.");
+ return;
+ }
+ if (packet.Length < 3)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " Sent an invalid npc interaction packet.");
+ return;
+ }
+ byte action = packet[1];
+ if (action == PacketBuilder.NPC_START_CHAT)
+ {
+
+ string packetStr = Encoding.UTF8.GetString(packet);
+ string number = packetStr.Substring(2, packetStr.Length - 4);
+ int chatId = 0;
+
+ try
+ {
+ chatId = int.Parse(number);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to start talking to an NPC with id that is NaN.");
+ return;
+ }
+ if(!Npc.NpcExists(chatId))
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to start talking to an NPC that doesnt exist.");
+ return;
+ }
+ sender.LoggedinUser.MajorPriority = true;
+ Npc.NpcEntry entry = Npc.GetNpcById(chatId);
+
+ if(entry.Chatpoints.Length <= 0)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to start talking to an NPC with no chatpoints.");
+ return;
+ }
+
+ int defaultChatpointId = Npc.GetDefaultChatpoint(sender.LoggedinUser, entry);
+ Npc.NpcChat startingChatpoint = Npc.GetNpcChatpoint(entry, defaultChatpointId);
+
+ string metaInfo = Meta.BuildNpcChatpoint(sender.LoggedinUser, entry, startingChatpoint);
+ byte[] metaPacket = PacketBuilder.CreateMetaPacket(metaInfo);
+ sender.SendPacket(metaPacket);
+
+ sender.LoggedinUser.LastTalkedToNpc = entry;
+ }
+ else if (action == PacketBuilder.NPC_CONTINUE_CHAT)
+ {
+ string packetStr = Encoding.UTF8.GetString(packet);
+ string number = packetStr.Substring(2, packetStr.Length - 4);
+ int replyId = 0;
+ try
+ {
+ replyId = int.Parse(number);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to reply to an NPC with replyid that is NaN.");
+ return;
+ }
+
+ Npc.NpcEntry lastNpc = sender.LoggedinUser.LastTalkedToNpc;
+ Npc.NpcReply reply;
+ try
+ {
+ reply = Npc.GetNpcReply(lastNpc, replyId);
+ }
+ catch(KeyNotFoundException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to reply with replyid that does not exist.");
+ return;
+ }
+
+ if (reply.GotoChatpoint == -1)
+ {
+ UpdateArea(sender);
+ return;
+ }
+ sender.LoggedinUser.MajorPriority = true;
+ string metaInfo = Meta.BuildNpcChatpoint(sender.LoggedinUser, lastNpc, Npc.GetNpcChatpoint(lastNpc, reply.GotoChatpoint));
+ byte[] metaPacket = PacketBuilder.CreateMetaPacket(metaInfo);
+ sender.SendPacket(metaPacket);
+ return;
+ }
+ }
+ public static void OnTransportUsed(GameClient sender, byte[] packet)
+ {
+ if (!sender.LoggedIn)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " Sent transport packet when not logged in.");
+ return;
+ }
+ if (packet.Length < 3)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " Sent an invalid transport packet.");
+ return;
+ }
+
+
+ string packetStr = Encoding.UTF8.GetString(packet);
+ string number = packetStr.Substring(1, packetStr.Length - 3);
+
+ int transportid;
+ try
+ {
+ transportid = Int32.Parse(number);
+ }
+ catch(FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to use a transport with id that is NaN.");
+ return;
+ }
+ try
+ {
+ Transport.TransportPoint transportPoint = Transport.GetTransportPoint(sender.LoggedinUser.X, sender.LoggedinUser.Y);
+ if (transportPoint.X != sender.LoggedinUser.X && transportPoint.Y != sender.LoggedinUser.Y)
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to use transport id: " + transportid.ToString() + " while not the correct transport point!");
+ return;
+ }
+
+ Transport.TransportLocation transportLocation = Transport.GetTransportLocation(transportid);
+ int cost = transportLocation.Cost;
+
+ if (transportLocation.Type == "WAGON")
+ {
+ if(sender.LoggedinUser.OwnedRanch != null)
+ {
+ if(sender.LoggedinUser.OwnedRanch.GetBuildingCount(7) > 0) // Wagon
+ {
+ cost = 0;
+ }
+ }
+ }
+
+ if (sender.LoggedinUser.Bids.Length > 0)
+ {
+ byte[] cantBuyWhileAuctioning = PacketBuilder.CreateChat(Messages.AuctionNoOtherTransactionAllowed, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantBuyWhileAuctioning);
+ return;
+ }
+
+
+ if (sender.LoggedinUser.Money >= cost)
+ {
+ string swfToLoad = Messages.BoatCutscene;
+ if (transportLocation.Type == "WAGON")
+ swfToLoad = Messages.WagonCutscene;
+
+ if (transportLocation.Type != "ROWBOAT")
+ {
+ byte[] swfModulePacket = PacketBuilder.CreateSwfModulePacket(swfToLoad, PacketBuilder.PACKET_SWF_CUTSCENE);
+ sender.SendPacket(swfModulePacket);
+ }
+
+ sender.LoggedinUser.Teleport(transportLocation.GotoX, transportLocation.GotoY);
+ sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.Transport).Count++;
+
+
+ if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.Transport).Count >= 500)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(27)); // Traveller
+ if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.Transport).Count >= 5000)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(28)); // Globetrotter
+
+ byte[] welcomeToIslePacket = PacketBuilder.CreateChat(Messages.FormatWelcomeToAreaMessage(transportLocation.LocationTitle), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(welcomeToIslePacket);
+
+ if(cost > 0)
+ sender.LoggedinUser.TakeMoney(cost);
+ }
+ else
+ {
+ byte[] cantAfford = PacketBuilder.CreateChat(Messages.CantAffordTransport, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantAfford);
+ }
+ }
+ catch (KeyNotFoundException)
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to use transport id: " + transportid.ToString() + " while not on a transport point!");
+ }
+
+
+ }
+ public static void OnRanchPacket(GameClient sender, byte[] packet)
+ {
+ if (!sender.LoggedIn)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " Sent ranch packet when not logged in.");
+ return;
+ }
+ if (packet.Length < 4)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid ranch packet.");
+ return;
+ }
+ string packetStr = Encoding.UTF8.GetString(packet);
+ byte method = packet[1];
+
+ if (method == PacketBuilder.RANCH_INFO)
+ {
+ string buildingIdStr = packetStr.Substring(2, packetStr.Length - 4);
+ int buildingId = 0;
+ try
+ {
+ buildingId = int.Parse(buildingIdStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to get info for building id NaN");
+ return;
+ }
+ if (Ranch.RanchBuilding.RanchBuildingExists(buildingId))
+ {
+ Ranch.RanchBuilding building = Ranch.RanchBuilding.GetRanchBuildingById(buildingId);
+
+ byte[] ranchBuild = PacketBuilder.CreateChat(Messages.FormatBuildingInformaton(building.Title, building.Description), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(ranchBuild);
+
+ return;
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to get info for building id that didnt exist.");
+ return;
+ }
+ }
+ else if (method == PacketBuilder.RANCH_SELL)
+ {
+ string NanSTR = packetStr.Substring(2, packetStr.Length - 4);
+ if (NanSTR == "NaN")
+ {
+ if (sender.LoggedinUser.OwnedRanch == null)
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to sell there ranch when they didnt own one.");
+ return;
+ }
+ int sellPrice = sender.LoggedinUser.OwnedRanch.GetSellPrice();
+ sender.LoggedinUser.AddMoney(sellPrice);
+ byte[] sellPacket = PacketBuilder.CreateChat(Messages.FormatRanchSoldMessage(sellPrice), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.LoggedinUser.OwnedRanch.OwnerId = -1;
+ sender.SendPacket(sellPacket);
+
+ // Change map sprite.
+ User[] users = GetUsersAt(sender.LoggedinUser.X, sender.LoggedinUser.Y, true, true);
+ foreach (User user in users)
+ {
+ byte[] MovementPacket = PacketBuilder.CreateMovementPacket(user.X, user.Y, user.CharacterId, user.Facing, PacketBuilder.DIRECTION_TELEPORT, true);
+ user.LoggedinClient.SendPacket(MovementPacket);
+ }
+ UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y, true);
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to sell there ranch without sending NaN.");
+ return;
+ }
+ }
+ else if (method == PacketBuilder.RANCH_UPGRADE)
+ {
+ string NanSTR = packetStr.Substring(2, packetStr.Length - 4);
+ if (NanSTR == "NaN")
+ {
+ if (sender.LoggedinUser.OwnedRanch != null)
+ {
+ Ranch.RanchUpgrade currentUpgrade = sender.LoggedinUser.OwnedRanch.GetRanchUpgrade();
+
+ if (!Ranch.RanchUpgrade.RanchUpgradeExists(currentUpgrade.Id + 1))
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to upgrade there ranch when it was max upgrade.");
+ return;
+ }
+
+ Ranch.RanchUpgrade nextUpgrade = Ranch.RanchUpgrade.GetRanchUpgradeById(currentUpgrade.Id + 1);
+ if (sender.LoggedinUser.Money >= nextUpgrade.Cost)
+ {
+ sender.LoggedinUser.TakeMoney(nextUpgrade.Cost);
+ sender.LoggedinUser.OwnedRanch.InvestedMoney += nextUpgrade.Cost;
+ sender.LoggedinUser.OwnedRanch.UpgradedLevel++;
+
+ byte[] upgraded = PacketBuilder.CreateChat(Messages.UpgradedMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(upgraded);
+
+ // Change map sprite.
+ User[] users = GetUsersAt(sender.LoggedinUser.X, sender.LoggedinUser.Y, true, true);
+ foreach (User user in users)
+ {
+ byte[] MovementPacket = PacketBuilder.CreateMovementPacket(user.X, user.Y, user.CharacterId, user.Facing, PacketBuilder.DIRECTION_TELEPORT, true);
+ user.LoggedinClient.SendPacket(MovementPacket);
+ }
+ UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y, true);
+ }
+ else
+ {
+ byte[] cantAfford = PacketBuilder.CreateChat(Messages.UpgradeCannotAfford, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantAfford);
+ }
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to upgrade there ranch when they didnt own one.");
+ }
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to upgrade there ranch without sending NaN.");
+ return;
+ }
+ }
+ else if (method == PacketBuilder.RANCH_REMOVE)
+ {
+ string buildingIdStr = packetStr.Substring(2, packetStr.Length - 4);
+ int buildingId = 0;
+ try
+ {
+ buildingId = int.Parse(buildingIdStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to get info for building id NaN");
+ return;
+ }
+ if (Ranch.RanchBuilding.RanchBuildingExists(buildingId))
+ {
+ Ranch.RanchBuilding building = Ranch.RanchBuilding.GetRanchBuildingById(buildingId);
+ int ranchBuild = sender.LoggedinUser.LastClickedRanchBuilding;
+ if (ranchBuild <= 0)
+ return;
+ if (sender.LoggedinUser.OwnedRanch != null)
+ {
+ if (ranchBuild > sender.LoggedinUser.OwnedRanch.GetRanchUpgrade().Limit)
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to remove more buildings than the limit.");
+ return;
+ }
+
+ Ranch.RanchBuilding ranchBuilding = sender.LoggedinUser.OwnedRanch.GetBuilding(ranchBuild - 1);
+
+ if (ranchBuilding == null)
+ return;
+
+ if (ranchBuilding.Id == buildingId)
+ {
+ sender.LoggedinUser.OwnedRanch.SetBuilding(ranchBuild - 1, null);
+ sender.LoggedinUser.AddMoney(ranchBuilding.GetTeardownPrice());
+ sender.LoggedinUser.OwnedRanch.InvestedMoney -= building.Cost;
+ byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatBuildingTornDown(ranchBuilding.GetTeardownPrice()), PacketBuilder.CHAT_BOTTOM_RIGHT);
+
+ sender.SendPacket(chatPacket);
+ UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y, true);
+ return;
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to remove bulidingid: " + buildingId + " from building slot " + ranchBuild + " but the building was not found there.");
+ }
+
+ }
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to remove in a ranch when they dont own one.");
+ return;
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to get info for building id that didnt exist.");
+ return;
+ }
+ }
+ else if (method == PacketBuilder.RANCH_BUILD)
+ {
+ string buildingIdStr = packetStr.Substring(2, packetStr.Length - 4);
+ int buildingId = 0;
+ try
+ {
+ buildingId = int.Parse(buildingIdStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to get info for building id NaN");
+ return;
+ }
+ if (Ranch.RanchBuilding.RanchBuildingExists(buildingId))
+ {
+ Ranch.RanchBuilding building = Ranch.RanchBuilding.GetRanchBuildingById(buildingId);
+ int ranchBuild = sender.LoggedinUser.LastClickedRanchBuilding;
+ if (ranchBuild == 0)
+ return;
+ if (sender.LoggedinUser.OwnedRanch != null)
+ {
+ if (ranchBuild > sender.LoggedinUser.OwnedRanch.GetRanchUpgrade().Limit)
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to build more buildings than the limit.");
+ return;
+ }
+
+ if (sender.LoggedinUser.Money >= building.Cost)
+ {
+ sender.LoggedinUser.OwnedRanch.SetBuilding(ranchBuild - 1, building);
+ sender.LoggedinUser.OwnedRanch.InvestedMoney += building.Cost;
+ sender.LoggedinUser.TakeMoney(building.Cost);
+ byte[] chatPacket = PacketBuilder.CreateChat(Messages.RanchBuildingComplete, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatPacket);
+ UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y, true);
+ return;
+
+ }
+ else
+ {
+ byte[] chatPacket = PacketBuilder.CreateChat(Messages.RanchCantAffordThisBuilding, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatPacket);
+ return;
+ }
+ }
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to build in a ranch when they dont own one.");
+ return;
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to get info for building id that didnt exist.");
+ return;
+ }
+ }
+ else if (method == PacketBuilder.RANCH_BUY)
+ {
+ string nan = packetStr.Substring(2, packetStr.Length - 4);
+ if (nan == "NaN")
+ {
+ if (Ranch.IsRanchHere(sender.LoggedinUser.X, sender.LoggedinUser.Y))
+ {
+ Ranch ranch = Ranch.GetRanchAt(sender.LoggedinUser.X, sender.LoggedinUser.Y);
+ if (sender.LoggedinUser.Money >= ranch.Value)
+ {
+ byte[] broughtRanch = PacketBuilder.CreateChat(Messages.FormatRanchBroughtMessage(ranch.Value), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(broughtRanch);
+ sender.LoggedinUser.TakeMoney(ranch.Value);
+ ranch.OwnerId = sender.LoggedinUser.Id;
+ ranch.InvestedMoney += ranch.Value;
+ sender.LoggedinUser.OwnedRanch = ranch;
+ sender.LoggedinUser.Inventory.AddIgnoringFull(new ItemInstance(Item.DorothyShoes));
+ UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y, true);
+
+ }
+ else
+ {
+ byte[] cantAfford = PacketBuilder.CreateChat(Messages.RanchCantAffordRanch, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantAfford);
+ }
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to buy a non existant ranch.");
+ return;
+ }
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent RANCH_BUY without \"NaN\".");
+ return;
+ }
+ }
+ else if (method == PacketBuilder.RANCH_CLICK)
+ {
+ if (packet.Length < 6)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid ranch click packet.");
+ return;
+ }
+ byte action = packet[2];
+ if (action == PacketBuilder.RANCH_CLICK_BUILD)
+ {
+ if (Ranch.IsRanchHere(sender.LoggedinUser.X, sender.LoggedinUser.Y))
+ {
+ Ranch ranch = Ranch.GetRanchAt(sender.LoggedinUser.X, sender.LoggedinUser.Y);
+ if (sender.LoggedinUser.OwnedRanch != null)
+ {
+ if (sender.LoggedinUser.OwnedRanch.Id == ranch.Id)
+ {
+ int buildSlot = packet[3] - 40;
+ sender.LoggedinUser.LastClickedRanchBuilding = buildSlot;
+ sender.LoggedinUser.MajorPriority = true;
+
+ if (buildSlot == 0)
+ {
+ byte[] buildingsAvalible = PacketBuilder.CreateMetaPacket(Meta.BuildRanchUpgrade(ranch));
+ sender.SendPacket(buildingsAvalible);
+
+ }
+ else
+ {
+ byte[] buildingsAvalible = PacketBuilder.CreateMetaPacket(Meta.BuildRanchBuildingsAvalible(ranch, buildSlot));
+ sender.SendPacket(buildingsAvalible);
+ }
+
+
+ return;
+ }
+ }
+ }
+
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to build in a ranch they didnt own.");
+ return;
+ }
+ else if (action == PacketBuilder.RANCH_CLICK_NORM)
+ {
+ if (Ranch.IsRanchHere(sender.LoggedinUser.X, sender.LoggedinUser.Y))
+ {
+ Ranch ranch = Ranch.GetRanchAt(sender.LoggedinUser.X, sender.LoggedinUser.Y);
+ int buildSlot = packet[3] - 40;
+ sender.LoggedinUser.MajorPriority = true;
+
+ if (buildSlot == 0) // Main Building
+ {
+ byte[] upgradeDescription = PacketBuilder.CreateMetaPacket(Meta.BuildRanchBuilding(ranch, ranch.GetRanchUpgrade()));
+ sender.SendPacket(upgradeDescription);
+ }
+ else // Other Building
+ {
+ byte[] buildingDescription = PacketBuilder.CreateMetaPacket(Meta.BuildRanchBuilding(ranch, ranch.GetBuilding(buildSlot - 1)));
+ sender.SendPacket(buildingDescription);
+ }
+ return;
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " sent an Unknown ranch packet " + BitConverter.ToString(packet).Replace("-", " "));
+ }
+ }
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " sent an Unknown ranch packet " + BitConverter.ToString(packet).Replace("-", " "));
+ }
+ }
+ public static void OnChatPacket(GameClient sender, byte[] packet)
+ {
+ if (!sender.LoggedIn)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " Sent chat packet when not logged in.");
+ return;
+ }
+
+ if (packet.Length < 4)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " Sent an invalid chat packet.");
+ return;
+ }
+
+
+ string packetStr = Encoding.UTF8.GetString(packet);
+
+ Chat.ChatChannel channel = (Chat.ChatChannel)packet[1];
+ string message = packetStr.Substring(2, packetStr.Length - 4);
+
+ Logger.DebugPrint(sender.LoggedinUser.Username + " Attempting to say '" + message + "' in channel: " + channel.ToString());
+
+ string nameTo = null;
+ if (channel == Chat.ChatChannel.Dm)
+ {
+ nameTo = Chat.GetDmRecipiant(message);
+ message = Chat.GetDmMessage(message);
+ }
+
+ if (message == "")
+ return;
+
+ if (message.StartsWith("/"))
+ {
+ string channelString = message.Split(' ')[0].ToLower();
+ string newMessage = string.Join(' ', message.Split(' ').Skip(1));
+ message = newMessage.Trim();
+
+ if (message == "")
+ channelString = "/";
+
+ switch (channelString)
+ {
+ case "/$":
+ case "/ads":
+ channel = Chat.ChatChannel.Ads;
+ break;
+ case "/a":
+ case "/all":
+ channel = Chat.ChatChannel.All;
+ break;
+ case "/h":
+ case "/here":
+ channel = Chat.ChatChannel.Here;
+ break;
+ case "/n":
+ case "/near":
+ channel = Chat.ChatChannel.Near;
+ break;
+ case "/b":
+ case "/buddy":
+ channel = Chat.ChatChannel.Buddies;
+ break;
+ case "/i":
+ case "/island":
+ channel = Chat.ChatChannel.Isle;
+ break;
+ case "/admin":
+ if (sender.LoggedinUser.Administrator)
+ channel = Chat.ChatChannel.Admin;
+ else
+ return;
+ break;
+ case "/mod":
+ if (sender.LoggedinUser.Moderator)
+ channel = Chat.ChatChannel.Mod;
+ else
+ return;
+ break;
+ default:
+ channel = Chat.ChatChannel.Dm;
+ nameTo = channelString.Substring(1).Trim();
+ break;
+ }
+
+ if (message == "") // this is how pinto does it, im serious.
+ {
+ channel = Chat.ChatChannel.Dm;
+ nameTo = "";
+ }
+ }
+
+ message = message.Trim();
+
+ if (channel == Chat.ChatChannel.All && message.Length > 150)
+ {
+ byte[] tooLong = PacketBuilder.CreateChat(Messages.GlobalChatTooLong, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(tooLong);
+ return;
+ }
+
+ if (channel == Chat.ChatChannel.Ads && message.Length > 150)
+ {
+ byte[] tooLong = PacketBuilder.CreateChat(Messages.AdsChatTooLong, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(tooLong);
+ return;
+ }
+ if (Chat.ProcessCommand(sender.LoggedinUser, message))
+ {
+ Logger.DebugPrint(sender.LoggedinUser.Username + " Attempting to run command '" + message + "' in channel: " + channel.ToString());
+ return;
+ }
+
+ // Check events
+ if (RiddleEvent.Active)
+ if(RiddleEvent.CheckRiddle(message))
+ RiddleEvent.Win(sender.LoggedinUser);
+
+
+
+ // Check if player is muting channel
+
+ if( (sender.LoggedinUser.MuteGlobal && channel == Chat.ChatChannel.All) || (sender.LoggedinUser.MuteAds && channel == Chat.ChatChannel.Ads) || (sender.LoggedinUser.MuteHere && channel == Chat.ChatChannel.Here) && (sender.LoggedinUser.MuteBuddy && channel == Chat.ChatChannel.Buddies) && (sender.LoggedinUser.MuteNear && channel == Chat.ChatChannel.Near) && (sender.LoggedinUser.MuteIsland && channel == Chat.ChatChannel.Isle))
+ {
+ byte[] cantSendMessage = PacketBuilder.CreateChat(Messages.CantSendInMutedChannel, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantSendMessage);
+ return;
+ }
+
+ if(sender.LoggedinUser.MutePrivateMessage && channel == Chat.ChatChannel.Dm)
+ {
+ byte[] cantSendDmMessage = PacketBuilder.CreateChat(Messages.CantSendPrivateMessageWhileMuted, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantSendDmMessage);
+ return;
+ }
+
+ Object violationReason = Chat.FilterMessage(message);
+ if (violationReason != null)
+ {
+ sender.LoggedinUser.ChatViolations += 1;
+ string chatViolationMessage = Messages.FormatGlobalChatViolationMessage((Chat.Reason)violationReason);
+ byte[] chatViolationPacket = PacketBuilder.CreateChat(chatViolationMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatViolationPacket);
+ return;
+ }
+
+ byte chatSide = Chat.GetSide(channel);
+ message = Chat.DoCorrections(message);
+ message = Chat.EscapeMessage(message);
+
+ string failedReason = Chat.NonViolationChecks(sender.LoggedinUser, message);
+ if (failedReason != null)
+ {
+ byte[] failedMessage = PacketBuilder.CreateChat(failedReason, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(failedMessage);
+ return;
+ }
+
+ GameClient[] recipiants = Chat.GetRecipiants(sender.LoggedinUser, channel, nameTo);
+
+
+ if(channel == Chat.ChatChannel.Dm)
+ {
+ if(recipiants.Length <= 0)
+ {
+ byte[] cantFindPlayer = PacketBuilder.CreateChat(Messages.CantFindPlayerToPrivateMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantFindPlayer);
+
+ return;
+ }
+ else
+ {
+ nameTo = recipiants[0].LoggedinUser.Username;
+ }
+ }
+
+ // Spam filter
+ if(ConfigReader.EnableSpamFilter)
+ {
+ if (channel == Chat.ChatChannel.Ads)
+ {
+ if (!sender.LoggedinUser.CanUseAdsChat && !sender.LoggedinUser.Administrator)
+ {
+ byte[] cantSendInAds = PacketBuilder.CreateChat(Messages.AdsOnlyOncePerMinute, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantSendInAds);
+
+ return;
+ }
+ sender.LoggedinUser.CanUseAdsChat = false;
+ }
+ else if (channel == Chat.ChatChannel.All)
+ {
+ if (sender.LoggedinUser.TotalGlobalChatMessages <= 0 && !sender.LoggedinUser.Administrator)
+ {
+ byte[] globalLimited = PacketBuilder.CreateChat(Messages.GlobalChatLimited, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(globalLimited);
+
+ return;
+ }
+ sender.LoggedinUser.TotalGlobalChatMessages--;
+ }
+ }
+
+
+ // Muted user checks
+ if(channel == Chat.ChatChannel.Dm)
+ {
+ try
+ {
+ User userTo = GetUserByNameStartswith(nameTo);
+ if (sender.LoggedinUser.MutePlayer.IsUserMuted(userTo))
+ {
+ byte[] dmWasBlocked = PacketBuilder.CreateChat(Messages.FormatCantSendYourIgnoringPlayer(userTo.Username), PacketBuilder.CHAT_DM_RIGHT);
+ sender.SendPacket(dmWasBlocked);
+ return;
+ }
+ else if (userTo.MutePrivateMessage)
+ {
+ byte[] dmWasBlocked = PacketBuilder.CreateChat(Messages.FormatPlayerIgnoringAllPms(userTo.Username), PacketBuilder.CHAT_DM_RIGHT);
+ sender.SendPacket(dmWasBlocked);
+ return;
+ }
+ else if (userTo.MutePlayer.IsUserMuted(sender.LoggedinUser))
+ {
+ byte[] dmWasBlocked = PacketBuilder.CreateChat(Messages.FormatPlayerIgnoringYourPms(userTo.Username), PacketBuilder.CHAT_DM_RIGHT);
+ sender.SendPacket(dmWasBlocked);
+ return;
+ }
+ }
+ catch (KeyNotFoundException)
+ {
+ return;
+ }
+ }
+ // Finally send chat message.
+ string formattedMessage = Chat.FormatChatForOthers(sender.LoggedinUser, channel, message);
+ string formattedMessageSender = Chat.FormatChatForSender(sender.LoggedinUser, channel, message, nameTo);
+
+
+ byte[] chatPacketOthers = PacketBuilder.CreateChat(formattedMessage, chatSide);
+ byte[] chatPacketSender = PacketBuilder.CreateChat(formattedMessageSender, chatSide);
+ byte[] playDmSound = PacketBuilder.CreatePlaysoundPacket(Chat.PrivateMessageSound);
+
+ // Send to clients ...
+ foreach (GameClient recipiant in recipiants)
+ {
+ recipiant.SendPacket(chatPacketOthers);
+
+ if (channel == Chat.ChatChannel.Dm)
+ recipiant.SendPacket(playDmSound);
+ }
+
+ // Send to sender
+ sender.SendPacket(chatPacketSender);
+
+ // AutoReply
+ if (channel == Chat.ChatChannel.Dm)
+ {
+ foreach (GameClient recipiant in recipiants)
+ {
+ if (recipiant.LoggedinUser.AutoReplyText != "")
+ {
+ string formattedMessageAuto = Chat.FormatChatForOthers(recipiant.LoggedinUser, channel, recipiant.LoggedinUser.AutoReplyText, true);
+ string formattedMessageSenderAuto = Chat.FormatChatForSender(recipiant.LoggedinUser, channel, recipiant.LoggedinUser.AutoReplyText, nameTo, true);
+
+ byte[] chatPacketAutoOthers = PacketBuilder.CreateChat(formattedMessageAuto, chatSide);
+ sender.SendPacket(chatPacketAutoOthers);
+
+ byte[] chatPacketAutoSender = PacketBuilder.CreateChat(formattedMessageSenderAuto, chatSide);
+ recipiant.SendPacket(chatPacketAutoSender);
+ }
+ }
+
+ }
+
+ }
+ 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 < 6)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid Click Packet");
+ return;
+ }
+
+ string packetStr = Encoding.UTF8.GetString(packet);
+ if(packetStr.Contains("|"))
+ {
+ string packetContents = packetStr.Substring(1, packetStr.Length - 3);
+ string[] xy = packetContents.Split('|');
+ int x = 0;
+ int y = 0;
+
+ try
+ {
+ x = int.Parse(xy[0])+4;
+ y = int.Parse(xy[1])+1;
+ }
+ catch(FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent a click packet with non-string xy value.");
+ return;
+ }
+
+ Logger.DebugPrint(sender.LoggedinUser.Username + " Clicked on tile: " + Map.GetTileId(x, y, false).ToString() + "(overlay: " + Map.GetTileId(x, y, true).ToString() + ") at " + x.ToString() + "," + y.ToString());
+
+
+ // 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;
+ }
+ if(Ranch.IsRanchHere(x, y)) // Ranch here?
+ {
+ Ranch ranch = Ranch.GetRanchAt(x, y);
+ if(ranch.OwnerId == -1)
+ {
+ returnedMsg = Messages.RanchUnownedRanchClicked;
+ }
+ else
+ {
+ string title = ranch.Title;
+ if (title == null || title == "")
+ title = Messages.RanchDefaultRanchTitle;
+ returnedMsg = Messages.FormatRanchClickMessage(Database.GetUsername(ranch.OwnerId), title);
+ }
+ }
+ User[] users = GetUsersAt(x, y, false, true);
+ if (users.Length > 0) // Player here?
+ {
+ string usernameStr = "";
+
+ for(int i = 0; i < users.Length; i++)
+ {
+ usernameStr += users[i].Username;
+ if (i + 1 < users.Length)
+ usernameStr += ", ";
+ }
+
+ returnedMsg = Messages.FormatPlayerHereMessage(usernameStr);
+ }
+
+ byte[] tileInfoPacket = PacketBuilder.CreateClickTileInfoPacket(returnedMsg);
+ sender.SendPacket(tileInfoPacket);
+ }
+ }
+ public static void OnItemInteraction(GameClient sender, byte[] packet)
+ {
+ if (!sender.LoggedIn)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " Sent object interaction packet when not logged in.");
+ return;
+ }
+ if (packet.Length < 3)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet. " + BitConverter.ToString(packet));
+ return;
+ }
+
+ byte action = packet[1];
+ switch(action)
+ {
+ case PacketBuilder.ITEM_PICKUP_ALL:
+ string chatMsg = Messages.GrabAllItemsMessage;
+ DroppedItems.DroppedItem[] droppedItems = DroppedItems.GetItemsAt(sender.LoggedinUser.X, sender.LoggedinUser.Y);
+
+ foreach (DroppedItems.DroppedItem item in droppedItems)
+ {
+ try
+ {
+ sender.LoggedinUser.Inventory.Add(item.Instance);
+ DroppedItems.RemoveDroppedItem(item);
+ }
+ catch (InventoryException)
+ {
+ chatMsg = Messages.GrabbedAllItemsButInventoryFull;
+ }
+ }
+
+ UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y);
+
+ byte[] chatMessage = PacketBuilder.CreateChat(chatMsg, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatMessage);
+
+ break;
+ case PacketBuilder.ITEM_PICKUP:
+ string packetStr = Encoding.UTF8.GetString(packet);
+ string randomIdStr = packetStr.Substring(2, packet.Length - 4);
+ int randomId = 0;
+
+ try
+ {
+ randomId = Int32.Parse(randomIdStr);
+ }
+ catch(FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet. " + BitConverter.ToString(packet));
+ return;
+ }
+
+ try
+ {
+ DroppedItems.DroppedItem item = DroppedItems.GetDroppedItemById(randomId);
+ try
+ {
+ sender.LoggedinUser.Inventory.Add(item.Instance);
+ }
+ catch (InventoryException)
+ {
+ byte[] inventoryFullMessage = PacketBuilder.CreateChat(Messages.GrabbedItemButInventoryFull, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(inventoryFullMessage);
+ break;
+ }
+
+
+ DroppedItems.RemoveDroppedItem(item);
+
+ UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y);
+
+ chatMessage = PacketBuilder.CreateChat(Messages.GrabbedItemMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatMessage);
+ }
+ catch(KeyNotFoundException)
+ {
+ byte[] pickedUp = PacketBuilder.CreateChat(Messages.DroppedItemCouldntPickup, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(pickedUp);
+
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to grab a non existing object.");
+ return;
+ }
+
+ break;
+ case PacketBuilder.ITEM_REMOVE:
+ char toRemove = (char)packet[2];
+ switch(toRemove)
+ {
+ case '1':
+ if(sender.LoggedinUser.EquipedCompetitionGear.Head != null)
+ {
+ ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedCompetitionGear.Head.Id);
+ sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance);
+ sender.LoggedinUser.EquipedCompetitionGear.Head = null;
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Attempted to remove competition gear when none was equipped.");
+ }
+ break;
+ case '2':
+ if (sender.LoggedinUser.EquipedCompetitionGear.Body != null)
+ {
+ ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedCompetitionGear.Body.Id);
+ sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance);
+ sender.LoggedinUser.EquipedCompetitionGear.Body = null;
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Attempted to remove competition gear when none was equipped.");
+ }
+ break;
+ case '3':
+ if (sender.LoggedinUser.EquipedCompetitionGear.Legs != null)
+ {
+ ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedCompetitionGear.Legs.Id);
+ sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance);
+ sender.LoggedinUser.EquipedCompetitionGear.Legs = null;
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Attempted to remove competition gear when none was equipped.");
+ }
+ break;
+ case '4':
+ if (sender.LoggedinUser.EquipedCompetitionGear.Feet != null)
+ {
+ ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedCompetitionGear.Feet.Id);
+ sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance);
+ sender.LoggedinUser.EquipedCompetitionGear.Feet = null;
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Attempted to remove competition gear when none was equipped.");
+ }
+ break;
+ case '5':
+ if (sender.LoggedinUser.EquipedJewelry.Slot1 != null)
+ {
+ ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedJewelry.Slot1.Id);
+ sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance);
+ sender.LoggedinUser.EquipedJewelry.Slot1 = null;
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Attempted to remove jewery when none was equipped.");
+ }
+ break;
+ case '6':
+ if (sender.LoggedinUser.EquipedJewelry.Slot2 != null)
+ {
+ ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedJewelry.Slot2.Id);
+ sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance);
+ sender.LoggedinUser.EquipedJewelry.Slot2 = null;
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Attempted to remove jewery when none was equipped.");
+ }
+ break;
+ case '7':
+ if (sender.LoggedinUser.EquipedJewelry.Slot3 != null)
+ {
+ ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedJewelry.Slot3.Id);
+ sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance);
+ sender.LoggedinUser.EquipedJewelry.Slot3 = null;
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Attempted to remove jewery when none was equipped.");
+ }
+ break;
+ case '8':
+ if (sender.LoggedinUser.EquipedJewelry.Slot4 != null)
+ {
+ ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedJewelry.Slot4.Id);
+ sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance);
+ sender.LoggedinUser.EquipedJewelry.Slot4 = null;
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Attempted to remove jewery when none was equipped.");
+ }
+ break;
+ default:
+ Logger.InfoPrint(sender.LoggedinUser.Username + "Unimplemented \"remove worn item\" ItemInteraction packet: " + BitConverter.ToString(packet).Replace("-", " "));
+ break;
+ }
+
+ UpdateStats(sender);
+ if(toRemove >= '1' && toRemove <= '4')
+ {
+ byte[] itemRemovedMessage = PacketBuilder.CreateChat(Messages.RemoveCompetitionGear, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(itemRemovedMessage);
+ }
+ else if (toRemove >= '5' && toRemove <= '8')
+ {
+ byte[] itemRemovedMessage = PacketBuilder.CreateChat(Messages.RemoveJewelry, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(itemRemovedMessage);
+ }
+
+ break;
+ case PacketBuilder.ITEM_THROW:
+ packetStr = Encoding.UTF8.GetString(packet);
+ string itemidStr = packetStr.Substring(2, packet.Length - 2);
+ int itemId = 0;
+
+ try
+ {
+ itemId = Int32.Parse(itemidStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet. (THROW) " + BitConverter.ToString(packet));
+ return;
+ }
+ if (sender.LoggedinUser.Inventory.HasItemId(itemId))
+ {
+ if (!Item.IsThrowable(itemId))
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to throw an item that isnt throwable.");
+ return;
+ }
+
+ ItemInstance curItem = sender.LoggedinUser.Inventory.GetItemByItemId(itemId).ItemInstances[0];
+ User[] userAt = GetReallyNearbyUsers(sender.LoggedinUser.X, sender.LoggedinUser.Y);
+
+ while (true)
+ {
+ int userIndx = RandomNumberGenerator.Next(0, userAt.Length);
+
+ if (userAt.Length > 1)
+ if (userAt[userIndx].Id == sender.LoggedinUser.Id)
+ continue;
+
+ Item.ThrowableItem throwableItem = Item.GetThrowableItem(curItem.ItemId);
+
+ if (userAt[userIndx].Id == sender.LoggedinUser.Id)
+ {
+ byte[] thrownHitYourself = PacketBuilder.CreateChat(throwableItem.HitYourselfMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(thrownHitYourself);
+ break;
+ }
+ if(itemId == Item.WaterBalloon)
+ {
+ if (WaterBalloonEvent != null)
+ if (WaterBalloonEvent.Active)
+ WaterBalloonEvent.AddWaterBallon(userAt[userIndx]);
+ }
+ if(itemId == Item.ModSplatterball)
+ {
+ ModsRevengeEvent.Payout(sender.LoggedinUser, userAt[userIndx]);
+ }
+
+ byte[] thrownForYou = PacketBuilder.CreateChat(Messages.FormatThrownItemMessage(throwableItem.ThrowMessage, userAt[userIndx].Username), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ byte[] thrownForOthers = PacketBuilder.CreateChat(Messages.FormatThrownItemMessage(throwableItem.HitMessage, sender.LoggedinUser.Username), PacketBuilder.CHAT_BOTTOM_RIGHT);
+
+ sender.SendPacket(thrownForYou);
+ userAt[userIndx].LoggedinClient.SendPacket(thrownForOthers);
+
+ break;
+ }
+
+ sender.LoggedinUser.Inventory.Remove(curItem);
+ UpdateInventory(sender);
+
+ }
+ break;
+ case PacketBuilder.ITEM_WRAP:
+ packetStr = Encoding.UTF8.GetString(packet);
+ randomIdStr = packetStr.Substring(2, packet.Length - 2);
+ randomId = 0;
+
+ try
+ {
+ randomId = Int32.Parse(randomIdStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet. " + BitConverter.ToString(packet));
+ return;
+ }
+ if (sender.LoggedinUser.Inventory.HasItem(randomId))
+ {
+ ItemInstance curItem = sender.LoggedinUser.Inventory.GetItemByRandomid(randomId).ItemInstances[0];
+ ItemInstance wrappedItem = new ItemInstance(Item.Present, -1, curItem.ItemId);
+
+ try
+ {
+ sender.LoggedinUser.Inventory.Add(wrappedItem);
+ sender.LoggedinUser.Inventory.Remove(curItem);
+ }
+ catch(InventoryException)
+ {
+ byte[] cantWrapPresent = PacketBuilder.CreateChat(Messages.SantaCantWrapInvFull, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantWrapPresent);
+ UpdateArea(sender);
+ break;
+ }
+ }
+ byte[] wrappedObjectMessage = PacketBuilder.CreateChat(Messages.SantaWrappedObjectMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(wrappedObjectMessage);
+ UpdateArea(sender);
+ break;
+ case PacketBuilder.ITEM_OPEN:
+ packetStr = Encoding.UTF8.GetString(packet);
+ randomIdStr = packetStr.Substring(2, packet.Length - 2);
+ randomId = 0;
+
+ try
+ {
+ randomId = Int32.Parse(randomIdStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet. " + BitConverter.ToString(packet));
+ return;
+ }
+ if (sender.LoggedinUser.Inventory.HasItem(randomId))
+ {
+ InventoryItem item = sender.LoggedinUser.Inventory.GetItemByRandomid(randomId);
+ int newItem = item.ItemInstances[0].Data;
+ if(newItem == 0)
+ {
+ sender.LoggedinUser.Inventory.Remove(item.ItemInstances[0]);
+
+ byte[] itemOpenFailedNothingInside = PacketBuilder.CreateChat(Messages.SantaCantOpenNothingInside, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(itemOpenFailedNothingInside);
+
+ UpdateInventory(sender);
+
+ break;
+ }
+
+ try
+ {
+ sender.LoggedinUser.Inventory.Add(new ItemInstance(newItem));
+ sender.LoggedinUser.Inventory.Remove(item.ItemInstances[0]);
+ }
+ catch(InventoryException)
+ {
+ byte[] cantOpenInvFull = PacketBuilder.CreateChat(Messages.SantaItemCantOpenInvFull, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantOpenInvFull);
+ break;
+ }
+ byte[] itemOpened = PacketBuilder.CreateChat(Messages.FormatSantaOpenPresent(Item.GetItemById(newItem).Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(itemOpened);
+ UpdateInventory(sender);
+ }
+ break;
+ case PacketBuilder.ITEM_USE:
+ packetStr = Encoding.UTF8.GetString(packet);
+ randomIdStr = packetStr.Substring(2, packet.Length - 4);
+
+ if(randomIdStr == "") // f12 ranch shortcut
+ {
+ if (sender.LoggedinUser.Inventory.HasItemId(Item.DorothyShoes))
+ {
+ InventoryItem itm = sender.LoggedinUser.Inventory.GetItemByItemId(Item.DorothyShoes);
+ Item.UseItem(sender.LoggedinUser, itm.ItemInstances[0]);
+ return;
+ }
+ else
+ {
+ byte[] noShoesMessage = PacketBuilder.CreateChat(Messages.RanchNoDorothyShoesMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(noShoesMessage);
+ return;
+ }
+ }
+
+ randomId = 0;
+
+ try
+ {
+ randomId = Int32.Parse(randomIdStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet. " + BitConverter.ToString(packet));
+ return;
+ }
+ if (sender.LoggedinUser.Inventory.HasItem(randomId))
+ {
+ InventoryItem itm = sender.LoggedinUser.Inventory.GetItemByRandomid(randomId);
+ Item.UseItem(sender.LoggedinUser, itm.ItemInstances[0]);
+ }
+ break;
+ case PacketBuilder.ITEM_WEAR:
+ packetStr = Encoding.UTF8.GetString(packet);
+ randomIdStr = packetStr.Substring(2, packet.Length - 2);
+ randomId = 0;
+
+ try
+ {
+ randomId = Int32.Parse(randomIdStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet. " + BitConverter.ToString(packet));
+ return;
+ }
+ if (sender.LoggedinUser.Inventory.HasItem(randomId))
+ {
+ InventoryItem itm = sender.LoggedinUser.Inventory.GetItemByRandomid(randomId);
+ ItemInstance instance = itm.ItemInstances[0];
+
+ Item.ItemInformation itemInf = instance.GetItemInfo();
+ if(itemInf.Type == "CLOTHES")
+ {
+ switch (itemInf.GetMiscFlag(0))
+ {
+ case CompetitionGear.MISC_FLAG_HEAD:
+ if (sender.LoggedinUser.EquipedCompetitionGear.Head == null)
+ sender.LoggedinUser.EquipedCompetitionGear.Head = itemInf;
+ else
+ {
+ ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedCompetitionGear.Head.Id);
+ sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance);
+ sender.LoggedinUser.EquipedCompetitionGear.Head = itemInf;
+ }
+ break;
+ case CompetitionGear.MISC_FLAG_BODY:
+ if (sender.LoggedinUser.EquipedCompetitionGear.Body == null)
+ sender.LoggedinUser.EquipedCompetitionGear.Body = itemInf;
+ else
+ {
+ ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedCompetitionGear.Body.Id);
+ sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance);
+ sender.LoggedinUser.EquipedCompetitionGear.Body = itemInf;
+ }
+ break;
+ case CompetitionGear.MISC_FLAG_LEGS:
+ if (sender.LoggedinUser.EquipedCompetitionGear.Legs == null)
+ sender.LoggedinUser.EquipedCompetitionGear.Legs = itemInf;
+ else
+ {
+ ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedCompetitionGear.Legs.Id);
+ sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance);
+ sender.LoggedinUser.EquipedCompetitionGear.Legs = itemInf;
+ }
+ break;
+ case CompetitionGear.MISC_FLAG_FEET:
+ if (sender.LoggedinUser.EquipedCompetitionGear.Feet == null)
+ sender.LoggedinUser.EquipedCompetitionGear.Feet = itemInf;
+ else
+ {
+ ItemInstance itemInstance = new ItemInstance(sender.LoggedinUser.EquipedCompetitionGear.Feet.Id);
+ sender.LoggedinUser.Inventory.AddIgnoringFull(itemInstance);
+ sender.LoggedinUser.EquipedCompetitionGear.Feet = itemInf;
+ }
+ break;
+ default:
+ Logger.ErrorPrint(itemInf.Name + " Has unknown misc flags.");
+ return;
+ }
+ sender.LoggedinUser.Inventory.Remove(instance);
+ byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatEquipCompetitionGearMessage(itemInf.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatPacket);
+ }
+ else if(itemInf.Type == "JEWELRY")
+ {
+ bool addedJewelry = false;
+ if (sender.LoggedinUser.EquipedJewelry.Slot1 == null)
+ {
+ sender.LoggedinUser.EquipedJewelry.Slot1 = itemInf;
+ addedJewelry = true;
+ }
+ else if (sender.LoggedinUser.EquipedJewelry.Slot2 == null)
+ {
+ sender.LoggedinUser.EquipedJewelry.Slot2 = itemInf;
+ addedJewelry = true;
+ }
+ else if (sender.LoggedinUser.EquipedJewelry.Slot3 == null)
+ {
+ sender.LoggedinUser.EquipedJewelry.Slot3 = itemInf;
+ addedJewelry = true;
+ }
+ else if (sender.LoggedinUser.EquipedJewelry.Slot4 == null)
+ {
+ sender.LoggedinUser.EquipedJewelry.Slot4 = itemInf;
+ addedJewelry = true;
+ }
+
+ if(addedJewelry)
+ {
+ sender.LoggedinUser.Inventory.Remove(instance);
+ byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatJewerlyEquipMessage(itemInf.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatPacket);
+ }
+ else
+ {
+ byte[] chatPacket = PacketBuilder.CreateChat(Messages.MaxJewelryMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatPacket);
+ }
+ }
+
+ UpdateInventory(sender);
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to wear an item they did not have.");
+ }
+ break;
+ case PacketBuilder.ITEM_DRINK:
+ packetStr = Encoding.UTF8.GetString(packet);
+ string idStr = packetStr.Substring(2, packet.Length - 4);
+ if(idStr == "NaN") // Fountain
+ {
+ string msg = Messages.FountainDrankYourFull;
+ bool looseMoney = RandomNumberGenerator.Next(0, 20) == 18;
+ if(looseMoney)
+ {
+ int looseAmount = RandomNumberGenerator.Next(0, 100);
+ if (looseAmount > sender.LoggedinUser.Money)
+ looseAmount = sender.LoggedinUser.Money;
+ sender.LoggedinUser.TakeMoney(looseAmount);
+ msg = Messages.FormatDroppedMoneyMessage(looseAmount);
+ }
+
+ sender.LoggedinUser.Thirst = 1000;
+ byte[] drankFromFountainMessage = PacketBuilder.CreateChat(msg, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(drankFromFountainMessage);
+ }
+ else
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + "Sent unknown ITEM_DRINK command id: " + idStr);
+ }
+ break;
+ case PacketBuilder.ITEM_CONSUME:
+ packetStr = Encoding.UTF8.GetString(packet);
+ randomIdStr = packetStr.Substring(2, packet.Length - 3);
+ randomId = 0;
+
+ try
+ {
+ randomId = Int32.Parse(randomIdStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet. " + BitConverter.ToString(packet));
+ return;
+ }
+
+ if (sender.LoggedinUser.Inventory.HasItem(randomId))
+ {
+ InventoryItem itm = sender.LoggedinUser.Inventory.GetItemByRandomid(randomId);
+ ItemInstance instance = itm.ItemInstances[0];
+ sender.LoggedinUser.Inventory.Remove(instance);
+ Item.ItemInformation itmInfo = instance.GetItemInfo();
+ bool toMuch = Item.ConsumeItem(sender.LoggedinUser, itmInfo);
+
+ byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatConsumeItemMessaege(itmInfo.Name), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatPacket);
+ if (toMuch)
+ {
+ chatPacket = PacketBuilder.CreateChat(Messages.ConsumedButMaxReached, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatPacket);
+ }
+
+ UpdateInventory(sender);
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to consume an item they did not have.");
+ }
+ break;
+ case PacketBuilder.ITEM_DROP:
+ packetStr = Encoding.UTF8.GetString(packet);
+ randomIdStr = packetStr.Substring(2, packet.Length - 2);
+ randomId = 0;
+
+ try
+ {
+ randomId = Int32.Parse(randomIdStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet. (drop)"+BitConverter.ToString(packet));
+ return;
+ }
+
+ if(sender.LoggedinUser.Inventory.HasItem(randomId))
+ {
+ InventoryItem itm = sender.LoggedinUser.Inventory.GetItemByRandomid(randomId);
+ ItemInstance instance = itm.ItemInstances[0];
+ if(DroppedItems.GetItemsAt(sender.LoggedinUser.X, sender.LoggedinUser.Y).Length > 25)
+ {
+ byte[] tileIsFullPacket = PacketBuilder.CreateChat(Messages.DroppedItemTileIsFull, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(tileIsFullPacket);
+ break;
+ }
+ DroppedItems.AddItem(instance, sender.LoggedinUser.X, sender.LoggedinUser.Y);
+ sender.LoggedinUser.Inventory.Remove(instance);
+ byte[] chatPacket = PacketBuilder.CreateChat(Messages.DroppedAnItemMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(chatPacket);
+ UpdateInventory(sender);
+
+ UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y, false, sender.LoggedinUser);
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to drop an item they did not have.");
+ }
+ break;
+ case PacketBuilder.ITEM_SHOVEL:
+ if (packet[2] != 0x14)
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Used ITEM_SHOVEL with 3rd byte not 0x14.");
+ if (!Quest.UseTool(sender.LoggedinUser, Quest.Shovel, sender.LoggedinUser.X, sender.LoggedinUser.Y))
+ {
+ byte[] ChatPacket = PacketBuilder.CreateChat(Messages.ShovelNothing, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(ChatPacket);
+ }
+ break;
+ case PacketBuilder.ITEM_RAKE:
+ if (packet[2] != 0x14)
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Used ITEM_RAKE with 3rd byte not 0x14.");
+ if (!Quest.UseTool(sender.LoggedinUser, Quest.Rake, sender.LoggedinUser.X, sender.LoggedinUser.Y))
+ {
+ byte[] ChatPacket = PacketBuilder.CreateChat(Messages.RakeNothing, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(ChatPacket);
+ }
+ break;
+ case PacketBuilder.ITEM_MAGNIFYING:
+ if (packet[2] != 0x14)
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Used ITEM_MAGNIFYING with 3rd byte not 0x14.");
+ if (!Quest.UseTool(sender.LoggedinUser, Quest.MagnifyingGlass, sender.LoggedinUser.X, sender.LoggedinUser.Y))
+ {
+ byte[] ChatPacket = PacketBuilder.CreateChat(Messages.MagnifyNothing, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(ChatPacket);
+ }
+ break;
+ case PacketBuilder.ITEM_BINOCULARS:
+ if (packet[2] != 0x14)
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Used ITEM_BINOCULARS with 3rd byte not 0x14.");
+ if(!Quest.UseTool(sender.LoggedinUser, Quest.Binoculars, sender.LoggedinUser.X, sender.LoggedinUser.Y))
+ {
+ byte[] ChatPacket = PacketBuilder.CreateChat(Messages.BinocularsNothing, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(ChatPacket);
+ }
+ break;
+ case PacketBuilder.ITEM_CRAFT:
+ packetStr = Encoding.UTF8.GetString(packet);
+ string craftIdStr = packetStr.Substring(2, packet.Length - 2);
+ int craftId = 0;
+ // Prevent crashing on non-int string.
+ try
+ {
+ craftId = Int32.Parse(craftIdStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to craft using craft id NaN.");
+ return;
+ }
+ if(Workshop.CraftIdExists(craftId))
+ {
+ Workshop.CraftableItem itm = Workshop.GetCraftId(craftId);
+ if(itm.MoneyCost <= sender.LoggedinUser.Money) // Check money
+ {
+ foreach(Workshop.RequiredItem reqItem in itm.RequiredItems)
+ {
+ if (sender.LoggedinUser.Inventory.HasItemId(reqItem.RequiredItemId))
+ {
+ if (sender.LoggedinUser.Inventory.GetItemByItemId(reqItem.RequiredItemId).ItemInstances.Length < reqItem.RequiredItemCount)
+ goto failMissingItem;
+ }
+ else
+ goto failMissingItem;
+ }
+
+ // Finally create the items
+ try
+ {
+ sender.LoggedinUser.Inventory.Add(new ItemInstance(itm.GiveItemId));
+ }
+ catch(InventoryException)
+ {
+ byte[] inventoryFullMessage = PacketBuilder.CreateChat(Messages.WorkshopNoRoomInInventory, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(inventoryFullMessage);
+ break;
+ }
+ sender.LoggedinUser.TakeMoney(itm.MoneyCost);
+
+ // Remove the required items..
+ foreach(Workshop.RequiredItem reqItem in itm.RequiredItems)
+ for(int i = 0; i < reqItem.RequiredItemCount; i++)
+ sender.LoggedinUser.Inventory.Remove(sender.LoggedinUser.Inventory.GetItemByItemId(reqItem.RequiredItemId).ItemInstances[0]);
+
+ sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.Crafting).Count++;
+
+ if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.Crafting).Count >= 100)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(22)); // Craftiness
+ if (sender.LoggedinUser.TrackedItems.GetTrackedItem(Tracking.TrackableItem.Crafting).Count >= 1000)
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(23)); // Workmanship
+
+ byte[] itemCraftSuccess = PacketBuilder.CreateChat(Messages.WorkshopCraftingSuccess, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(itemCraftSuccess);
+ break;
+
+ }
+ else
+ {
+ byte[] cantAffordMessage = PacketBuilder.CreateChat(Messages.WorkshopCannotAfford, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantAffordMessage);
+ break;
+ }
+
+ failMissingItem:
+ {
+ byte[] missingItemMessage = PacketBuilder.CreateChat(Messages.WorkshopMissingRequiredItem, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(missingItemMessage);
+ break;
+ }
+ }
+
+ break;
+ case PacketBuilder.ITEM_SELL: // Handles selling an item.
+ int totalSold = 1;
+ int message = 1;
+
+ packetStr = Encoding.UTF8.GetString(packet);
+ randomIdStr = packetStr.Substring(2, packet.Length - 2);
+ randomId = 0;
+ // Prevent crashing on non-int string.
+ try
+ {
+ randomId = Int32.Parse(randomIdStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object sell packet.");
+ return;
+ }
+
+ if (!sender.LoggedinUser.Inventory.HasItem(randomId))
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to sell a item that they doesnt have in there inventory");
+ return;
+ }
+
+ InventoryItem invItem = sender.LoggedinUser.Inventory.GetItemByRandomid(randomId);
+ itemId = invItem.ItemId;
+ goto doSell;
+ case PacketBuilder.ITEM_SELL_ALL:
+ packetStr = Encoding.UTF8.GetString(packet);
+ string itemIdStr = packetStr.Substring(2, packet.Length - 2);
+ itemId = 0;
+ // Prevent crashing on non-int string.
+ try
+ {
+ itemId = Int32.Parse(itemIdStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object sell packet.");
+ return;
+ }
+
+ if (!sender.LoggedinUser.Inventory.HasItemId(itemId))
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to sell a item that they doesnt have in there inventory");
+ return;
+ }
+ invItem = sender.LoggedinUser.Inventory.GetItemByItemId(itemId);
+
+ totalSold = invItem.ItemInstances.Length;
+ message = 2;
+ goto doSell;
+ doSell:;
+
+ Item.ItemInformation itemInfo = Item.GetItemById(itemId);
+ Shop shop = sender.LoggedinUser.LastShoppedAt;
+ if (shop != null)
+ {
+ UInt64 sellPrice = Convert.ToUInt64(shop.CalculateSellCost(itemInfo) * Convert.ToUInt64(totalSold));
+ if (shop.CanSell(itemInfo))
+ {
+ // Check if goes over 2.1b
+ if (Convert.ToUInt64(sender.LoggedinUser.Money) + sellPrice > 2100000000)
+ {
+ byte[] cantSellMoneyCapCheck = PacketBuilder.CreateChat(Messages.CannotSellYoudGetTooMuchMoney, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantSellMoneyCapCheck);
+ break;
+ }
+
+ // Remove items
+ for (int i = 0; i < totalSold; i++)
+ {
+ ItemInstance itemInstance = invItem.ItemInstances[0];
+ sender.LoggedinUser.Inventory.Remove(itemInstance);
+ shop.Inventory.Add(itemInstance);
+ }
+
+ if (sellPrice < 2147483647) // Sanity Check (yes i checked it earlier)
+ sender.LoggedinUser.AddMoney(Convert.ToInt32(sellPrice));
+
+ UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y, true);
+ if(message == 1)
+ {
+ byte[] soldItemMessage = PacketBuilder.CreateChat(Messages.FormatSellMessage(itemInfo.Name, sellPrice), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(soldItemMessage);
+ }
+ if(message == 2)
+ {
+ string name = itemInfo.Name;
+
+ if (totalSold > 1)
+ name = itemInfo.PluralName;
+
+ byte[] soldItemMessage = PacketBuilder.CreateChat(Messages.FormatSellAllMessage(name, sellPrice, totalSold), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(soldItemMessage);
+ }
+
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to sell a item that was not avalible to be sold.");
+ }
+ }
+ break;
+
+ case PacketBuilder.ITEM_BUY_AND_CONSUME:
+ packetStr = Encoding.UTF8.GetString(packet);
+ itemIdStr = packetStr.Substring(2, packet.Length - 3);
+ itemId = 0;
+ // Prevent crashing on non-int string.
+ try
+ {
+ itemId = Int32.Parse(itemIdStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object buy and consume packet.");
+ return;
+ }
+ if (!Item.ItemIdExist(itemId))
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to buy an itemid that doesnt even exist.");
+ break;
+ }
+
+ Inn lastInn = sender.LoggedinUser.LastVisitedInn;
+ if (lastInn != null)
+ {
+ try
+ {
+ itemInfo = lastInn.GetStockedItem(itemId);
+ int price = lastInn.CalculateBuyCost(itemInfo);
+ if(sender.LoggedinUser.Money >= price)
+ {
+ sender.LoggedinUser.TakeMoney(price);
+ bool toMuch = Item.ConsumeItem(sender.LoggedinUser, itemInfo);
+
+ string tooMuchMessage = Messages.ConsumedButMaxReached;
+ if (itemInfo.Effects.Length > 0)
+ if (itemInfo.Effects[0].EffectsWhat == "TIREDNESS")
+ tooMuchMessage = Messages.InnFullyRested;
+ if (itemInfo.Effects.Length > 1)
+ if (itemInfo.Effects[1].EffectsWhat == "TIREDNESS")
+ tooMuchMessage = Messages.InnFullyRested;
+
+ byte[] enjoyedServiceMessage = PacketBuilder.CreateChat(Messages.FormatInnEnjoyedServiceMessage(itemInfo.Name, price), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(enjoyedServiceMessage);
+
+ if(toMuch)
+ {
+ byte[] toMuchMessage = PacketBuilder.CreateChat(tooMuchMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(toMuchMessage);
+ }
+
+ UpdateArea(sender);
+ }
+ else
+ {
+ byte[] cantAffordMessage = PacketBuilder.CreateChat(Messages.InnCannotAffordService, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantAffordMessage);
+ }
+ }
+ catch(KeyNotFoundException)
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to buy and consume an item not stocked by the inn there standing on.");
+ }
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to buy and consume item while not in a inn.");
+ }
+ break;
+
+ case PacketBuilder.ITEM_BUY: // Handles buying an item.
+ message = 1;
+ int count = 1;
+ goto doPurchase;
+ case PacketBuilder.ITEM_BUY_5:
+ message = 2;
+ count = 5;
+ goto doPurchase;
+ case PacketBuilder.ITEM_BUY_25:
+ message = 3;
+ count = 25;
+ doPurchase:;
+ packetStr = Encoding.UTF8.GetString(packet);
+ itemIdStr = packetStr.Substring(2, packet.Length - 3);
+ itemId = 0;
+ // Prevent crashing on non-int string.
+ try
+ {
+ itemId = Int32.Parse(itemIdStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object buy packet.");
+ return;
+ }
+
+ if(!Item.ItemIdExist(itemId))
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to buy an itemid that doesnt even exist.");
+ break;
+ }
+
+ itemInfo = Item.GetItemById(itemId);
+ shop = sender.LoggedinUser.LastShoppedAt;
+ if (shop != null)
+ {
+ UInt64 buyCost = Convert.ToUInt64(shop.CalculateBuyCost(itemInfo) * Convert.ToUInt64(count));
+ if (sender.LoggedinUser.Bids.Length > 0)
+ {
+ byte[] cantBuyWhileAuctioning = PacketBuilder.CreateChat(Messages.AuctionNoOtherTransactionAllowed, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantBuyWhileAuctioning);
+ return;
+ }
+
+ if (Convert.ToUInt64(sender.LoggedinUser.Money) < buyCost)
+ {
+ byte[] cantAffordMessage = PacketBuilder.CreateChat(Messages.CantAfford1, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(cantAffordMessage);
+ return;
+ }
+ if (shop.Inventory.HasItemId(itemId))
+ {
+ if (shop.Inventory.GetItemByItemId(itemId).ItemInstances.Length < count)
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to buy more of an item than is in stock.");
+ break;
+ }
+
+
+ // Check we wont overflow the inventory
+ if (sender.LoggedinUser.Inventory.HasItemId(itemId))
+ {
+ InventoryItem items = sender.LoggedinUser.Inventory.GetItemByItemId(itemId);
+ if (items.ItemInstances.Length + count > Item.MAX_STACK)
+ {
+ goto showError;
+ }
+
+ }
+ else if(sender.LoggedinUser.Inventory.Count + 1 > sender.LoggedinUser.MaxItems)
+ {
+ goto showError;
+ }
+
+ for (int i = 0; i < count; i++)
+ {
+ ItemInstance itemInstance = shop.Inventory.GetItemByItemId(itemId).ItemInstances[0];
+ try
+ {
+ sender.LoggedinUser.Inventory.Add(itemInstance);
+ }
+ catch (InventoryException)
+ {
+ Logger.ErrorPrint("Failed to add: " + itemInfo.Name + " to " + sender.LoggedinUser.Username + " inventory.");
+ break;
+ }
+ shop.Inventory.Remove(itemInstance);
+ }
+
+ if(buyCost < 2147483647) // Sanity Check (yes i checked it earlier)
+ sender.LoggedinUser.TakeMoney(Convert.ToInt32(buyCost));
+
+
+ // Send chat message to client.
+ UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y, true);
+ if (message == 1)
+ {
+ byte[] broughtItemMessage = PacketBuilder.CreateChat(Messages.FormatBuyMessage(itemInfo.Name, buyCost), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(broughtItemMessage);
+ }
+ else if (message == 2)
+ {
+ byte[] broughtItemMessage = PacketBuilder.CreateChat(Messages.FormatBuy5Message(itemInfo.PluralName, buyCost), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(broughtItemMessage);
+ }
+ else if (message == 3)
+ {
+ byte[] broughtItemMessage = PacketBuilder.CreateChat(Messages.FormatBuy25Message(itemInfo.PluralName, buyCost), PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(broughtItemMessage);
+ }
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to buy a item that was not for sale.");
+ }
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to buy an item while not in a store.");
+ }
+
+
+ break;
+
+ showError:;
+ if (message == 1)
+ {
+ byte[] inventoryFullMessage = PacketBuilder.CreateChat(Messages.Brought1ButInventoryFull, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(inventoryFullMessage);
+ }
+ else if (message == 2)
+ {
+
+ byte[] inventoryFullMessage = PacketBuilder.CreateChat(Messages.Brought5ButInventoryFull, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(inventoryFullMessage);
+ }
+ else if (message == 3)
+ {
+
+ byte[] inventoryFullMessage = PacketBuilder.CreateChat(Messages.Brought25ButInventoryFull, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(inventoryFullMessage);
+ }
+ break;
+ case PacketBuilder.ITEM_RIP:
+ packetStr = Encoding.UTF8.GetString(packet);
+ randomIdStr = packetStr.Substring(2, packet.Length - 2);
+ randomId = 0;
+ try
+ {
+ randomId = Int32.Parse(randomIdStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet. " + BitConverter.ToString(packet));
+ return;
+ }
+
+ if (!sender.LoggedinUser.Inventory.HasItem(randomId))
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to rip someone elses mail. " + randomId.ToString());
+ return;
+ }
+
+ InventoryItem ripItems = sender.LoggedinUser.Inventory.GetItemByRandomid(randomId);
+ foreach (ItemInstance item in ripItems.ItemInstances)
+ {
+ if (item.RandomId == randomId)
+ {
+ if (item.Data == 0)
+ continue;
+ sender.LoggedinUser.MailBox.RipUpMessage(sender.LoggedinUser.MailBox.GetMessageByRandomId(item.Data));
+ break;
+ }
+ }
+ break;
+ case PacketBuilder.ITEM_VIEW:
+ byte method = packet[2];
+ if (method == PacketBuilder.ITEM_LOOK)
+ {
+ packetStr = Encoding.UTF8.GetString(packet);
+ itemIdStr = packetStr.Substring(3, packet.Length - 3);
+ itemId = 0;
+ try
+ {
+ itemId = Int32.Parse(itemIdStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet. " + BitConverter.ToString(packet));
+ return;
+ }
+
+ if (itemId == Item.MailMessage)
+ {
+ if (!sender.LoggedinUser.Inventory.HasItemId(Item.MailMessage))
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Tried to view a mail message when they didnt have one.");
+ return;
+ }
+
+ sender.LoggedinUser.MajorPriority = true;
+ byte[] mailList = PacketBuilder.CreateMetaPacket(Meta.BuildMailList(sender.LoggedinUser, sender.LoggedinUser.Inventory.GetItemByItemId(Item.MailMessage)));
+ sender.SendPacket(mailList);
+ break;
+ }
+ }
+ else if(method == PacketBuilder.ITEM_READ)
+ {
+ packetStr = Encoding.UTF8.GetString(packet);
+ randomIdStr = packetStr.Substring(3, packet.Length - 3);
+ randomId = 0;
+ try
+ {
+ randomId = Int32.Parse(randomIdStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet. " + BitConverter.ToString(packet));
+ return;
+ }
+
+ if (!sender.LoggedinUser.Inventory.HasItem(randomId))
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to view someone elses mail. " + randomId.ToString());
+ return;
+ }
+
+ InventoryItem items = sender.LoggedinUser.Inventory.GetItemByRandomid(randomId);
+ foreach (ItemInstance item in items.ItemInstances)
+ {
+ if (item.RandomId == randomId)
+ {
+ if (item.Data == 0)
+ continue;
+
+ sender.LoggedinUser.MajorPriority = true;
+ byte[] readMail = PacketBuilder.CreateMetaPacket(Meta.BuildMailLetter(sender.LoggedinUser.MailBox.GetMessageByRandomId(item.Data), randomId));
+ sender.SendPacket(readMail);
+ break;
+ }
+ }
+ break;
+
+ }
+
+
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Unknown Method- " + method.ToString("X") + " " + BitConverter.ToString(packet).Replace("-", " "));
+ break;
+ case PacketBuilder.PACKET_INFORMATION:
+ packetStr = Encoding.UTF8.GetString(packet);
+ string valueStr = packetStr.Substring(3, packet.Length - 3);
+ int value = 0;
+ try
+ {
+ value = Int32.Parse(valueStr);
+ }
+ catch (FormatException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction packet. "+BitConverter.ToString(packet));
+ return;
+ }
+ if (packet[2] == PacketBuilder.ITEM_INFORMATON)
+ {
+ itemId = -1;
+ if (sender.LoggedinUser.Inventory.HasItem(value))
+ itemId = sender.LoggedinUser.Inventory.GetItemByRandomid(value).ItemId;
+ else if (DroppedItems.IsDroppedItemExist(value))
+ itemId = DroppedItems.GetDroppedItemById(value).Instance.ItemId;
+ if (itemId == -1)
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " asked for details of non existiant item.");
+ return;
+ }
+ sender.LoggedinUser.MajorPriority = true;
+ Item.ItemInformation info = Item.GetItemById(itemId);
+ string infoMessage = Meta.BuildItemInfo(info);
+ byte[] metaPacket = PacketBuilder.CreateMetaPacket(infoMessage);
+ sender.SendPacket(metaPacket);
+ }
+ if (packet[2] == PacketBuilder.ITEM_INFORMATON_ID)
+ {
+ sender.LoggedinUser.MajorPriority = true;
+ if (!Item.ItemIdExist(value))
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " asked for details of non existiant item.");
+ return;
+ }
+
+ Item.ItemInformation info = Item.GetItemById(value);
+ string infoMessage = Meta.BuildItemInfo(info);
+ byte[] metaPacket = PacketBuilder.CreateMetaPacket(infoMessage);
+ sender.SendPacket(metaPacket);
+ }
+ else if(packet[2] == PacketBuilder.NPC_INFORMATION)
+ {
+ if(Npc.NpcExists(value))
+ {
+ sender.LoggedinUser.MajorPriority = true;
+ Npc.NpcEntry npc = Npc.GetNpcById(value);
+ string infoMessage = Meta.BuildNpcInfo(npc);
+ byte[] metaPacket = PacketBuilder.CreateMetaPacket(infoMessage);
+ sender.SendPacket(metaPacket);
+ }
+ else
+ {
+ Logger.HackerPrint(sender.LoggedinUser.Username + " asked for details of non existiant npc.");
+ return;
+ }
+ }
+
+ break;
+ default:
+ Logger.WarnPrint(sender.LoggedinUser.Username + " Sent an unknown Item Interaction Packet type: " + action.ToString() + ", Packet Dump: " + BitConverter.ToString(packet).Replace('-', ' '));
+ break;
+ }
+
+ }
+ public static void OnInventoryRequested(GameClient sender, byte[] packet)
+ {
+ if (!sender.LoggedIn)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " Sent chat packet when not logged in.");
+ return;
+ }
+
+ if (packet.Length < 2)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " Sent an invalid inventory request packet.");
+ return;
+ }
+
+ UpdateInventory(sender);
+ }
+ public static void OnLoginRequest(GameClient sender, byte[] packet)
+ {
+ Logger.DebugPrint("Login request received from: " + sender.RemoteIp);
+
+ string loginRequestString = Encoding.UTF8.GetString(packet).Substring(1);
+
+ if (!loginRequestString.Contains('|') || packet.Length < 3)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " Sent an invalid login request");
+ return;
+ }
+
+ if (packet[1] != PacketBuilder.PACKET_CLIENT_TERMINATOR)
+ {
+ string[] loginParts = loginRequestString.Split('|');
+ if (loginParts.Length < 3)
+ {
+ Logger.ErrorPrint(sender.RemoteIp + " Sent a login request of invalid length. " + loginRequestString);
+ return;
+ }
+
+ int version = int.Parse(loginParts[0]);
+ string encryptedUsername = loginParts[1];
+ string encryptedPassword = loginParts[2];
+ string username = Authentication.DecryptLogin(encryptedUsername);
+ string password = Authentication.DecryptLogin(encryptedPassword);
+
+ if (Authentication.CheckPassword(username, password))
+ {
+ // Obtain user information
+ int userId = Database.GetUserid(username);
+
+ if(Database.IsUserBanned(userId))
+ {
+ Logger.DebugPrint(sender.RemoteIp + " Tried to login to : " + username + " but, the account was banned.");
+ byte[] userBannedPacket = PacketBuilder.CreateLoginPacket(false, Messages.LoginFailedReasonBanned);
+ sender.SendPacket(userBannedPacket);
+ return;
+ }
+
+ if(Database.IsIpBanned(sender.RemoteIp))
+ {
+ Logger.DebugPrint(sender.RemoteIp + " Tried to login to : " + username + " but, the IP was banned.");
+ byte[] ipBannedPacket = PacketBuilder.CreateLoginPacket(false, Messages.FormatIpBannedMessage(sender.RemoteIp));
+ sender.SendPacket(ipBannedPacket);
+ return;
+ }
+
+
+
+
+ sender.Login(userId);
+ sender.LoggedinUser.Password = password;
+
+ byte[] ResponsePacket = PacketBuilder.CreateLoginPacket(true);
+ sender.SendPacket(ResponsePacket);
+
+ Logger.DebugPrint(sender.RemoteIp + " Logged into : " + sender.LoggedinUser.Username + " (ADMIN: " + sender.LoggedinUser.Administrator + " MOD: " + sender.LoggedinUser.Moderator + ")");
+
+ }
+ else
+ {
+ Logger.WarnPrint(sender.RemoteIp + " Attempted to login to: " + username + " with incorrect password ");
+ byte[] ResponsePacket = PacketBuilder.CreateLoginPacket(false);
+ sender.SendPacket(ResponsePacket);
+ }
+ }
+
+ }
+
+ public static void OnDisconnect(GameClient sender)
+ {
+ if (sender.LoggedIn)
+ {
+ Database.SetPlayerLastLogin(Convert.ToInt32(new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds()), sender.LoggedinUser.Id); // Set last login date
+ Database.RemoveOnlineUser(sender.LoggedinUser.Id);
+
+ // Leave multirooms
+ Multiroom.LeaveAllMultirooms(sender.LoggedinUser);
+ TwoPlayer.TwoPlayerRemove(sender.LoggedinUser);
+
+ // Remove Trade Reference
+ sender.LoggedinUser.TradingWith = null;
+ sender.LoggedinUser.PendingTradeTo = 0;
+
+ // Leave open water balloon game
+ if (WaterBalloonEvent != null)
+ if(WaterBalloonEvent.Active)
+ WaterBalloonEvent.LeaveEvent(sender.LoggedinUser);
+
+ // Leave open quiz.
+ if (QuizEvent != null)
+ QuizEvent.LeaveEvent(sender.LoggedinUser);
+
+ ModsRevengeEvent.LeaveEvent(sender.LoggedinUser);
+
+ // Delete Arena Entries
+ if (Arena.UserHasEnteredHorseInAnyArena(sender.LoggedinUser))
+ {
+ Arena arena = Arena.GetArenaUserEnteredIn(sender.LoggedinUser);
+ arena.DeleteEntry(sender.LoggedinUser);
+ }
+
+
+ // Send disconnect message
+ byte[] logoutMessageBytes = PacketBuilder.CreateChat(Messages.FormatLogoutMessage(sender.LoggedinUser.Username), PacketBuilder.CHAT_BOTTOM_LEFT);
+ foreach (GameClient client in GameClient.ConnectedClients)
+ if (client.LoggedIn)
+ if (!client.LoggedinUser.MuteLogins && !client.LoggedinUser.MuteAll)
+ if (client.LoggedinUser.Id != sender.LoggedinUser.Id)
+ client.SendPacket(logoutMessageBytes);
+
+ // Tell clients of diconnect (remove from chat)
+ byte[] playerRemovePacket = PacketBuilder.CreatePlayerLeavePacket(sender.LoggedinUser.Username);
+ foreach (GameClient client in GameClient.ConnectedClients)
+ if (client.LoggedIn)
+ if (client.LoggedinUser.Id != sender.LoggedinUser.Id)
+ client.SendPacket(playerRemovePacket);
+ }
+
+ }
+
+ /*
+ * Get(Some Information)
+ */
+
+
+ public static bool IsUserOnline(int id)
+ {
+ try
+ {
+ GetUserById(id);
+ return true;
+ }
+ catch (KeyNotFoundException)
+ {
+ return false;
+ }
+ }
+
+ public static User[] GetUsersInTown(World.Town town, bool includeStealth = false, bool includeMuted = false)
+ {
+ List usersInTown = new List();
+ foreach (GameClient client in GameClient.ConnectedClients)
+ if (client.LoggedIn)
+ {
+ if (!includeStealth && client.LoggedinUser.Stealth)
+ continue;
+ if (!includeMuted && client.LoggedinUser.MuteIsland)
+ continue;
+ if (World.InTown(client.LoggedinUser.X, client.LoggedinUser.Y))
+ if (World.GetIsle(client.LoggedinUser.X, client.LoggedinUser.Y).Name == town.Name)
+ usersInTown.Add(client.LoggedinUser);
+ }
+
+ return usersInTown.ToArray();
+ }
+ public static User[] GetUsersInIsle(World.Isle isle, bool includeStealth = false, bool includeMuted = false)
+ {
+ List usersInIsle = new List();
+ foreach (GameClient client in GameClient.ConnectedClients)
+ if (client.LoggedIn)
+ {
+ if (!includeStealth && client.LoggedinUser.Stealth)
+ continue;
+ if (!includeMuted && client.LoggedinUser.MuteIsland)
+ continue;
+ if (World.InIsle(client.LoggedinUser.X, client.LoggedinUser.Y))
+ if (World.GetIsle(client.LoggedinUser.X, client.LoggedinUser.Y).Name == isle.Name)
+ usersInIsle.Add(client.LoggedinUser);
+ }
+
+ return usersInIsle.ToArray();
+ }
+
+ public static User[] GetUsersOnSpecialTileCode(string code)
+ {
+ List userList = new List();
+
+ foreach (GameClient client in GameClient.ConnectedClients)
+ {
+ if (client.LoggedIn)
+ {
+
+ if (World.InSpecialTile(client.LoggedinUser.X, client.LoggedinUser.Y))
+ {
+ World.SpecialTile tile = World.GetSpecialTile(client.LoggedinUser.X, client.LoggedinUser.Y);
+
+ if (tile.Code == code)
+ {
+ userList.Add(client.LoggedinUser);
+ }
+ }
+ }
+ }
+ return userList.ToArray();
+ }
+ public static User[] GetUsersAt(int x, int y, bool includeStealth = false, bool includeMuted = false)
+ {
+ List usersHere = new List();
+ foreach(GameClient client in GameClient.ConnectedClients)
+ {
+ if(client.LoggedIn)
+ {
+ if (!includeStealth && client.LoggedinUser.Stealth)
+ continue;
+ if (!includeMuted && client.LoggedinUser.MuteNear)
+ continue;
+ if (client.LoggedinUser.X == x && client.LoggedinUser.Y == y)
+ usersHere.Add(client.LoggedinUser);
+ }
+ }
+ return usersHere.ToArray();
+ }
+ public static User GetUserByNameStartswith(string username)
+ {
+ foreach (GameClient client in GameClient.ConnectedClients)
+ {
+ if (client.LoggedIn)
+ {
+ if (client.LoggedinUser.Username.ToLower().StartsWith(username.ToLower()))
+ return client.LoggedinUser;
+ }
+ }
+ throw new KeyNotFoundException("User was not found.");
+ }
+
+ public static User GetUserByName(string username)
+ {
+ foreach(GameClient client in GameClient.ConnectedClients)
+ {
+ if(client.LoggedIn)
+ {
+ if (client.LoggedinUser.Username.ToLower() == username.ToLower())
+ return client.LoggedinUser;
+ }
+ }
+ throw new KeyNotFoundException("User was not found.");
+ }
+
+ public static User GetUserById(int id)
+ {
+ foreach(GameClient client in GameClient.ConnectedClients)
+ {
+ if (client.LoggedIn)
+ if (client.LoggedinUser.Id == id)
+ return client.LoggedinUser;
+ }
+
+ throw new KeyNotFoundException("User not found (not online?)");
+ }
+
+ public static User[] GetReallyNearbyUsers(int x, int y)
+ {
+ int startX = x - 3;
+ int endX = x + 3;
+ int startY = y - 3;
+ int endY = y + 3;
+ List usersNearby = new List();
+
+ foreach (GameClient client in GameClient.ConnectedClients)
+ {
+ if (client.LoggedIn)
+ {
+ if (startX <= client.LoggedinUser.X && endX >= client.LoggedinUser.X && startY <= client.LoggedinUser.Y && endY >= client.LoggedinUser.Y)
+ usersNearby.Add(client.LoggedinUser);
+ }
+ }
+
+ return usersNearby.ToArray();
+ }
+
+
+ public static bool IsOnScreen(int screenX, int screenY, int playerX, int playerY)
+ {
+ int startX = screenX - 9;
+ int endX = screenX + 9;
+ int startY = screenY - 8;
+ int endY = screenY + 9;
+ if (startX <= playerX && endX >= playerX && startY <= playerY && endY >= playerY)
+ return true;
+ else
+ return false;
+ }
+ public static User[] GetOnScreenUsers(int x, int y, bool includeStealth = false, bool includeMuted = false)
+ {
+
+ List usersOnScreen = new List();
+
+ foreach (GameClient client in GameClient.ConnectedClients)
+ if (client.LoggedIn)
+ {
+ if (!includeStealth && client.LoggedinUser.Stealth)
+ continue;
+ if (!includeMuted && client.LoggedinUser.MuteNear)
+ continue;
+ if (IsOnScreen(x,y,client.LoggedinUser.X, client.LoggedinUser.Y))
+ usersOnScreen.Add(client.LoggedinUser);
+ }
+
+ return usersOnScreen.ToArray();
+ }
+
+ public static User[] GetNearbyUsers(int x, int y, bool includeStealth=false, bool includeMuted=false)
+ {
+ int startX = x - 15;
+ int endX = x + 15;
+ int startY = y - 19;
+ int endY = y + 19;
+ List usersNearby = new List();
+
+ foreach (GameClient client in GameClient.ConnectedClients)
+ {
+ if (client.LoggedIn)
+ {
+ if (!includeStealth && client.LoggedinUser.Stealth)
+ continue;
+ if (!includeMuted && client.LoggedinUser.MuteNear)
+ continue;
+ if (startX <= client.LoggedinUser.X && endX >= client.LoggedinUser.X && startY <= client.LoggedinUser.Y && endY >= client.LoggedinUser.Y)
+ usersNearby.Add(client.LoggedinUser);
+ }
+ }
+
+ return usersNearby.ToArray();
+ }
+ public static int GetNumberOfPlayers(bool includeStealth=false)
+ {
+ int count = 0;
+ foreach(GameClient client in GameClient.ConnectedClients)
+ if (client.LoggedIn)
+ {
+ if (!includeStealth && client.LoggedinUser.Stealth)
+ continue;
+ if (!client.LoggedinUser.Stealth)
+ count++;
+ }
+
+ return count;
+ }
+
+ public static Point[] GetAllBuddyLocations(User caller)
+ {
+ List allLocations = new List();
+
+ foreach (GameClient client in GameClient.ConnectedClients)
+ {
+ if (client.LoggedIn)
+ {
+
+ if (!caller.Friends.List.Contains(client.LoggedinUser.Id))
+ continue;
+
+
+ if (!client.LoggedinUser.Stealth)
+ allLocations.Add(new Point(client.LoggedinUser.X, client.LoggedinUser.Y));
+
+ }
+ }
+
+ return allLocations.ToArray();
+ }
+
+ public static Point[] GetAllPlayerLocations(User caller)
+ {
+ List allLocations = new List();
+
+ foreach (GameClient client in GameClient.ConnectedClients)
+ {
+ if (client.LoggedIn)
+ {
+
+ if (client.LoggedinUser.Id == caller.Id)
+ continue;
+
+ if (!client.LoggedinUser.Stealth)
+ allLocations.Add(new Point(client.LoggedinUser.X, client.LoggedinUser.Y));
+
+ }
+
+
+ }
+ return allLocations.ToArray();
+ }
+ public static int GetNumberOfPlayersListeningToAdsChat()
+ {
+ int count = 0;
+ foreach (GameClient client in GameClient.ConnectedClients)
+ {
+ if (client.LoggedIn)
+ if (!client.LoggedinUser.MuteAds)
+ count++;
+ }
+ return count;
+ }
+
+ public static void CheckMail(User user)
+ {
+ if (user.MailBox.UnreadMailCount > 0)
+ {
+
+ byte[] RipOffAOLSound = PacketBuilder.CreatePlaysoundPacket(Messages.MailSe);
+ user.LoggedinClient.SendPacket(RipOffAOLSound);
+
+ byte[] mailReceivedText = PacketBuilder.CreateChat(Messages.MailReceivedMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ user.LoggedinClient.SendPacket(mailReceivedText);
+
+ user.MailBox.ReadAllMail();
+ }
+ }
+ public static int GetNumberOfModsOnline()
+ {
+ int count = 0;
+ foreach (GameClient client in GameClient.ConnectedClients)
+ {
+ if (client.LoggedIn)
+ if(client.LoggedinUser.Moderator)
+ count++;
+ }
+ return count;
+ }
+
+ public static int GetNumberOfBuddiesOnline(User user)
+ {
+ int total = 0;
+ foreach(int bud in user.Friends.List.ToArray())
+ {
+ if (IsUserOnline(bud))
+ {
+ total++;
+ }
+ }
+ return total;
+ }
+
+ public static int GetNumberOfAdminsOnline()
+ {
+ int count = 0;
+ foreach (GameClient client in GameClient.ConnectedClients)
+ {
+ if (client.LoggedIn)
+ if (client.LoggedinUser.Administrator)
+ count++;
+ }
+ return count;
+ }
+
+ /*
+ * Update game state functions.
+ */
+
+ public static void Update(GameClient client)
+ {
+ UpdateArea(client);
+ foreach (User nearbyUser in GameServer.GetNearbyUsers(client.LoggedinUser.X, client.LoggedinUser.Y, false, false))
+ if (nearbyUser.Id != client.LoggedinUser.Id)
+ if(!nearbyUser.MajorPriority)
+ if(!nearbyUser.MinorPriority)
+ UpdateArea(nearbyUser.LoggedinClient);
+
+ UpdateUserFacingAndLocation(client.LoggedinUser);
+ }
+
+ public static void UpdateDrawingForAll(string id, GameClient sender, string drawing, bool includingSender=false)
+ {
+ World.SpecialTile[] tiles = World.GetSpecialTilesByCode("MULTIROOM-" + id);
+ foreach (World.SpecialTile tile in tiles)
+ {
+ UpdateAreaForAll(tile.X, tile.Y, true, null);
+ User[] usersHere = GameServer.GetUsersAt(tile.X, tile.Y, true, true);
+ foreach (User user in usersHere)
+ {
+ if (!includingSender)
+ if (user.Id == sender.LoggedinUser.Id)
+ continue;
+
+ byte[] patchDrawing = PacketBuilder.CreateDrawingUpdatePacket(drawing);
+ user.LoggedinClient.SendPacket(patchDrawing);
+ }
+ }
+ }
+ public static void UpdateHorseMenu(GameClient forClient, HorseInstance horseInst)
+ {
+
+ forClient.LoggedinUser.MajorPriority = true;
+
+ int TileID = Map.GetTileId(forClient.LoggedinUser.X, forClient.LoggedinUser.Y, false);
+ string type = Map.TerrainTiles[TileID - 1].Type;
+
+ if (horseInst.Owner == forClient.LoggedinUser.Id)
+ forClient.LoggedinUser.LastViewedHorse = horseInst;
+ else
+ forClient.LoggedinUser.LastViewedHorseOther = horseInst;
+
+ byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildHorseInformation(horseInst, forClient.LoggedinUser));
+ forClient.SendPacket(metaPacket);
+
+ string loadSwf = HorseInfo.BreedViewerSwf(horseInst, type);
+ byte[] swfPacket = PacketBuilder.CreateSwfModulePacket(loadSwf, PacketBuilder.PACKET_SWF_MODULE_FORCE);
+ forClient.SendPacket(swfPacket);
+ }
+ public static void UpdateInventory(GameClient forClient)
+ {
+ if (!forClient.LoggedIn)
+ return;
+ forClient.LoggedinUser.MajorPriority = true;
+ byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildInventoryInfo(forClient.LoggedinUser.Inventory));
+ forClient.SendPacket(metaPacket);
+ }
+
+ public static void UpdateWeather(GameClient forClient)
+ {
+ if (!forClient.LoggedIn)
+ {
+ Logger.ErrorPrint(forClient.RemoteIp + "tried to update weather information when not logged in.");
+ return;
+ }
+
+ string lastWeather = forClient.LoggedinUser.LastSeenWeather;
+ string weather = forClient.LoggedinUser.GetWeatherSeen();
+ if (lastWeather != weather)
+ {
+ byte[] WeatherUpdate = PacketBuilder.CreateWeatherUpdatePacket(weather);
+ forClient.SendPacket(WeatherUpdate);
+ }
+ }
+ public static void UpdateWorld(GameClient forClient)
+ {
+ if (!forClient.LoggedIn)
+ {
+ Logger.ErrorPrint(forClient.RemoteIp + "tried to update world information when not logged in.");
+ return;
+ }
+
+ byte[] WorldData = PacketBuilder.CreateWorldData(World.ServerTime.Minutes, World.ServerTime.Days, World.ServerTime.Years, forClient.LoggedinUser.GetWeatherSeen());
+ forClient.SendPacket(WorldData);
+ }
+ public static void UpdatePlayer(GameClient forClient)
+ {
+ if (!forClient.LoggedIn)
+ {
+ Logger.ErrorPrint(forClient.RemoteIp + "tried to update player information when not logged in.");
+ return;
+ }
+ byte[] PlayerData = PacketBuilder.CreatePlayerData(forClient.LoggedinUser.Money, GameServer.GetNumberOfPlayers(), forClient.LoggedinUser.MailBox.UnreadMailCount);
+ forClient.SendPacket(PlayerData);
+ }
+
+ public static void UpdateUserFacingAndLocation(User user)
+ {
+ byte[] playerInfoBytes = PacketBuilder.CreatePlayerInfoUpdateOrCreate(user.X, user.Y, user.Facing, user.CharacterId, user.Username);
+
+ foreach (User onScreenUser in GetOnScreenUsers(user.X, user.Y, true, true))
+ if (onScreenUser.Id != user.Id)
+ onScreenUser.LoggedinClient.SendPacket(playerInfoBytes);
+ }
+ public static void UpdateAreaForAll(int x, int y, bool ignoreMetaPrio=false, User exceptMe=null)
+ {
+ foreach(GameClient client in GameClient.ConnectedClients)
+ {
+ if (client.LoggedIn)
+ if (client.LoggedinUser.X == x && client.LoggedinUser.Y == y)
+ if(!client.LoggedinUser.MinorPriority || ignoreMetaPrio)
+ if(!client.LoggedinUser.MajorPriority)
+ if(client.LoggedinUser != exceptMe)
+ UpdateArea(client);
+ }
+ }
+
+ public static void UpdateArea(GameClient forClient)
+ {
+ if(forClient == null)
+ {
+ Logger.ErrorPrint(forClient.RemoteIp + "tried to update tile information when not connected.");
+ return;
+ }
+ if (!forClient.LoggedIn)
+ {
+ Logger.ErrorPrint(forClient.RemoteIp + "tried to update tile information when not logged in.");
+ return;
+ }
+
+ if(forClient.LoggedinUser.TradingWith != null)
+ {
+ if (!forClient.LoggedinUser.TradingWith.OtherTrade.Trader.LoggedinClient.LoggedIn)
+ {
+ forClient.LoggedinUser.TradingWith.InteruptTrade();
+ return;
+ }
+
+ if (forClient.LoggedinUser.TradingWith.OtherTrade.Trader.TradingWith == null)
+ {
+ forClient.LoggedinUser.TradingWith.InteruptTrade();
+ return;
+ }
+
+ forClient.LoggedinUser.MajorPriority = true;
+ forClient.LoggedinUser.TradeMenuPriority = false;
+ byte[] tradeMeta = PacketBuilder.CreateMetaPacket(Meta.BuildTrade(forClient.LoggedinUser.TradingWith));
+ forClient.SendPacket(tradeMeta);
+ return;
+ }
+
+ forClient.LoggedinUser.MajorPriority = false;
+ forClient.LoggedinUser.MinorPriority = false;
+
+ string LocationStr = "";
+ int tileX = forClient.LoggedinUser.X;
+ int tileY = forClient.LoggedinUser.Y;
+ if (!World.InSpecialTile(tileX, tileY))
+ {
+ if (forClient.LoggedinUser.InRealTimeQuiz)
+ return;
+ LocationStr = Meta.BuildMetaInfo(forClient.LoggedinUser, tileX, tileY);
+ }
+ else
+ {
+ World.SpecialTile specialTile = World.GetSpecialTile(tileX, tileY);
+ if (specialTile.AutoplaySwf != null && specialTile.AutoplaySwf != "")
+ {
+ byte[] swfModulePacket = PacketBuilder.CreateSwfModulePacket(specialTile.AutoplaySwf,PacketBuilder.PACKET_SWF_MODULE_GENTLE);
+ forClient.SendPacket(swfModulePacket);
+ }
+
+ if (forClient.LoggedinUser.InRealTimeQuiz && QuizEvent != null)
+ {
+ QuizEvent.JoinEvent(forClient.LoggedinUser).UpdateParticipent();
+ return;
+ }
+
+ if (specialTile.Code != null)
+ if (!ProcessMapCodeWithArg(forClient, specialTile))
+ return;
+ LocationStr = Meta.BuildSpecialTileInfo(forClient.LoggedinUser, specialTile);
+ }
+
+
+ byte[] AreaMessage = PacketBuilder.CreateMetaPacket(LocationStr);
+ forClient.SendPacket(AreaMessage);
+
+ }
+ public static void UpdateStats(GameClient client)
+ {
+ if (!client.LoggedIn)
+ return;
+
+ client.LoggedinUser.MajorPriority = true;
+ string metaWind = Meta.BuildStatsMenu(client.LoggedinUser);
+ byte[] statsPacket = PacketBuilder.CreateMetaPacket(metaWind);
+ client.SendPacket(statsPacket);
+
+ }
+
+ /*
+ * Other...
+ */
+
+ public static void AddItemToAllUsersEvenOffline(int itemId, int itemCount)
+ {
+ int[] allUsers = Database.GetUsers();
+ foreach (int userid in allUsers)
+ {
+ for (int i = 0; i < itemCount; i++)
+ {
+ ItemInstance itm = new ItemInstance(itemId);
+
+ if (GameServer.IsUserOnline(userid))
+ GameServer.GetUserById(userid).Inventory.AddWithoutDatabase(itm);
+
+ Database.AddItemToInventory(userid, itm);
+ }
+ }
+ }
+
+ public static void RemoveAllItemsOfIdInTheGame(int id)
+ {
+ // Remove from all online players
+ foreach (GameClient connectedClient in GameClient.ConnectedClients)
+ {
+ if (connectedClient.LoggedIn)
+ {
+ if (connectedClient.LoggedinUser.Inventory.HasItemId(id))
+ {
+ InventoryItem invItm = connectedClient.LoggedinUser.Inventory.GetItemByItemId(id);
+ foreach (ItemInstance itm in invItm.ItemInstances.ToArray())
+ connectedClient.LoggedinUser.Inventory.Remove(itm);
+ }
+ }
+ }
+
+ // Remove from shops
+ foreach(Shop shop in Shop.ShopList)
+ {
+ if (shop.Inventory.HasItemId(id))
+ {
+ InventoryItem invItm = shop.Inventory.GetItemByItemId(id);
+ foreach (ItemInstance itm in invItm.ItemInstances.ToArray())
+ shop.Inventory.Remove(itm);
+ }
+
+ }
+ DroppedItems.DeleteAllItemsWithId(id); // Delete all dropped items
+ Database.DeleteAllItemsFromUsers(id); // Delete from offline players
+ }
+
+ public static void StartRidingHorse(GameClient sender, int horseRandomId)
+ {
+ HorseInstance horseMountInst = sender.LoggedinUser.HorseInventory.GetHorseById(horseRandomId);
+
+ if (horseMountInst.Breed.Type != "unicorn" && horseMountInst.Breed.Type != "pegasus")
+ {
+ if (horseMountInst.Equipment.Saddle == null || horseMountInst.Equipment.SaddlePad == null || horseMountInst.Equipment.Bridle == null)
+ {
+ byte[] horseNotTackedMessage = PacketBuilder.CreateChat(Messages.HorseCannotMountUntilTackedMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(horseNotTackedMessage);
+ return;
+ }
+ }
+
+
+ string ridingHorseMessage = Messages.FormatHorseRidingMessage(horseMountInst.Name);
+ byte[] ridingHorseMessagePacket = PacketBuilder.CreateChat(ridingHorseMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ sender.SendPacket(ridingHorseMessagePacket);
+
+ sender.LoggedinUser.CurrentlyRidingHorse = horseMountInst;
+
+ // Determine what sprite to use;
+ int incBy = 0;
+ switch (horseMountInst.Color)
+ {
+ case "brown":
+ incBy = 1;
+ break;
+ case "cremello":
+ case "white":
+ incBy = 2;
+ break;
+ case "black":
+ incBy = 3;
+ break;
+ case "chestnut":
+ incBy = 4;
+ break;
+ case "bay":
+ incBy = 5;
+ break;
+ case "grey":
+ incBy = 6;
+ break;
+ case "dun":
+ incBy = 7;
+ break;
+ case "palomino":
+ incBy = 8;
+ break;
+ case "roan":
+ incBy = 9;
+ break;
+ case "pinto":
+ incBy = 10;
+ break;
+ }
+
+
+ if (horseMountInst.Breed.Type == "zebra")
+ {
+ incBy = 11;
+ }
+ if (horseMountInst.Breed.Id == 5) // Appaloosa
+ {
+ if (horseMountInst.Color == "cremello")
+ incBy = 12;
+ }
+ if (horseMountInst.Breed.Type == "camel")
+ {
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(40)); // Camel Rider
+
+ incBy = 13;
+ }
+ if(horseMountInst.Breed.Type == "llama")
+ {
+ sender.LoggedinUser.Awards.AddAward(Award.GetAwardById(41)); // Llama Rider
+
+ incBy = 14;
+ }
+ if (horseMountInst.Breed.Type == "unicorn")
+ {
+ incBy = 15;
+ }
+ if (horseMountInst.Breed.Type == "pegasus")
+ {
+ incBy = 16;
+ }
+ if (horseMountInst.Breed.Id == 170) // Unipeg
+ {
+ incBy = 17;
+ }
+
+ incBy *= 5;
+ sender.LoggedinUser.Facing %= 5;
+ sender.LoggedinUser.Facing += incBy;
+ sender.LoggedinUser.LastRiddenHorse = horseRandomId;
+
+ UpdateUserFacingAndLocation(sender.LoggedinUser);
+
+ byte[] updatePlayer = PacketBuilder.CreateMovementPacket(sender.LoggedinUser.X, sender.LoggedinUser.Y, sender.LoggedinUser.CharacterId, sender.LoggedinUser.Facing, PacketBuilder.DIRECTION_NONE, true);
+ sender.SendPacket(updatePlayer);
+
+ if (sender.LoggedinUser.HorseWindowOpen)
+ UpdateArea(sender);
+ }
+ public static void DoItemPurchases(GameClient sender)
+ {
+ if (!sender.LoggedIn)
+ return;
+
+ Item.ItemPurchaseQueueItem[] queueItems = Database.GetItemPurchaseQueue(sender.LoggedinUser.Id);
+ foreach (Item.ItemPurchaseQueueItem queueItem in queueItems)
+ {
+ for (int i = 0; i < queueItem.ItemCount; i++)
+ {
+ sender.LoggedinUser.Inventory.AddIgnoringFull(new ItemInstance(queueItem.ItemId));
+ }
+ }
+ Database.ClearItemPurchaseQueue(sender.LoggedinUser.Id);
+
+ }
+ public static void StopRidingHorse(GameClient sender)
+ {
+ sender.LoggedinUser.CurrentlyRidingHorse = null;
+
+ sender.LoggedinUser.Facing %= 5;
+ UpdateUserFacingAndLocation(sender.LoggedinUser);
+
+ byte[] updatePlayer = PacketBuilder.CreateMovementPacket(sender.LoggedinUser.X, sender.LoggedinUser.Y, sender.LoggedinUser.CharacterId, sender.LoggedinUser.Facing, PacketBuilder.DIRECTION_NONE, true);
+ sender.SendPacket(updatePlayer);
+
+ if (sender.LoggedinUser.HorseWindowOpen)
+ UpdateArea(sender);
+ }
+ public static bool ProcessMapCodeWithArg(GameClient forClient, World.SpecialTile tile)
+ {
+ string mapCode = tile.Code;
+ if (mapCode == null)
+ return false;
+ if(mapCode.Contains('-'))
+ {
+ string[] codeInfo = mapCode.Split('-');
+ string command = codeInfo[0];
+ string paramaters = codeInfo[1];
+
+ if(command == "JUMP")
+ {
+ if(paramaters.Contains(','))
+ {
+ string[] args = paramaters.Split(',');
+ try
+ {
+ int newX = int.Parse(args[0]);
+ int newY = int.Parse(args[1]);
+ forClient.LoggedinUser.Teleport(newX, newY);
+ if (World.InIsle(tile.X, tile.Y))
+ {
+ World.Isle isle = World.GetIsle(tile.X, tile.Y);
+ int tileset = isle.Tileset;
+ int overlay = Map.GetTileId(tile.X, tile.Y, true);
+ if (tileset == 6 && overlay == 249) // warp point
+ {
+ byte[] swfPacket = PacketBuilder.CreateSwfModulePacket("warpcutscene", PacketBuilder.PACKET_SWF_CUTSCENE);
+ forClient.SendPacket(swfPacket);
+ }
+ }
+ return false;
+ }
+ catch(Exception)
+ {
+ return true;
+ }
+ }
+ }
+ }
+ if(mapCode == "HAMMOCK")
+ {
+ byte[] hammockText = PacketBuilder.CreateChat(Messages.HammockText, PacketBuilder.CHAT_BOTTOM_RIGHT);
+ forClient.SendPacket(hammockText);
+
+ forClient.LoggedinUser.Tiredness = 1000;
+ foreach(HorseInstance horse in forClient.LoggedinUser.HorseInventory.HorseList)
+ {
+ horse.BasicStats.Tiredness = 1000;
+ }
+ }
+ return true;
+ }
+ public static void OnShutdown()
+ {
+ if(ServerSocket != null)
+ ServerSocket.Dispose();
if (gameTimer != null)
gameTimer.Dispose();
if (minuteTimer != null)
- minuteTimer.Dispose();
- }
- public static void ShutdownServer()
+ minuteTimer.Dispose();
+ }
+ public static void ShutdownServer()
{
- ModLoader.OnShutdown();
- GameClient.OnShutdown();
- GameServer.OnShutdown();
- Database.OnShutdown();
- Entry.OnShutdown();
- }
-
- public static void StartServer()
- {
- ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- IPAddress hostIP = IPAddress.Parse(ConfigReader.BindIP);
- IPEndPoint ep = new IPEndPoint(hostIP, ConfigReader.Port);
- ServerSocket.Bind(ep);
- ServerSocket.Listen(0x7fffffff);
- gameTimer = new Timer(new TimerCallback(onGameTick), null, gameTickSpeed, gameTickSpeed);
- minuteTimer = new Timer(new TimerCallback(onMinuteTick), null, oneMinute, oneMinute);
- Logger.InfoPrint("Binding to ip: " + ConfigReader.BindIP + " On port: " + ConfigReader.Port.ToString());
-
-
- SocketAsyncEventArgs e = new SocketAsyncEventArgs();
- e.Completed += GameClient.CreateClient;
- GameClient.CreateClient(null, e);
- }
-
- }
-}
+ GameClient.OnShutdown();
+ GameServer.OnShutdown();
+ Database.OnShutdown();
+ Entry.OnShutdown();
+ }
+
+ public static void StartServer()
+ {
+ ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+ IPAddress hostIP = IPAddress.Parse(ConfigReader.BindIP);
+ IPEndPoint ep = new IPEndPoint(hostIP, ConfigReader.Port);
+ ServerSocket.Bind(ep);
+ ServerSocket.Listen(0x7fffffff);
+ gameTimer = new Timer(new TimerCallback(onGameTick), null, gameTickSpeed, gameTickSpeed);
+ minuteTimer = new Timer(new TimerCallback(onMinuteTick), null, oneMinute, oneMinute);
+ Logger.InfoPrint("Binding to ip: " + ConfigReader.BindIP + " On port: " + ConfigReader.Port.ToString());
+
+
+ SocketAsyncEventArgs e = new SocketAsyncEventArgs();
+ e.Completed += GameClient.CreateClient;
+ GameClient.CreateClient(null, e);
+ }
+
+ }
+}
diff --git a/HorseIsleServer/LibHISP/Server/ServerVersion.cs b/HorseIsleServer/LibHISP/Server/ServerVersion.cs
index 8d477ce..98173e7 100644
--- a/HorseIsleServer/LibHISP/Server/ServerVersion.cs
+++ b/HorseIsleServer/LibHISP/Server/ServerVersion.cs
@@ -1,4 +1,6 @@
-using HISP.Properties;
+using System;
+using System.Globalization;
+using HISP.Properties;
namespace HISP.Server
{
@@ -44,27 +46,33 @@ namespace HISP.Server
}
public static string GetVersionString()
{
- return Resources.GitTag.Replace("\r", "").Replace("\n", "");
+ return Resources.GitTag.Replace("\r", "").Replace("\n", "").ToString().Trim() + "."+ GetCommitHashVersion();
}
public static string GetBranch()
{
- return Resources.GitBranch.Replace("\r", "").Replace("\n", "");
+ return Resources.GitBranch.Replace("\r", "").Replace("\n", "").ToString().Trim();
}
public static string GetBuildDate()
{
- return Resources.BuildDate.Replace("\r", "").Replace("\n", "");
+ return Resources.BuildDate.Replace("\r", "").Replace("\n", "").ToString().Trim();
}
public static string GetBuildTime()
{
- return Resources.BuildTime.Replace("\r", "").Replace("\n", "");
+ return Resources.BuildTime.Replace("\r", "").Replace("\n", "").ToString().Trim();
}
+
+ public static string GetCommitHashVersion()
+ {
+ return UInt16.Parse(Resources.GitCommit.Substring(0, 4), NumberStyles.HexNumber).ToString();
+ }
+
public static string GetCommitHash(int TotalBytes)
{
- return Resources.GitCommit.Substring(0, TotalBytes).Replace("\r", "").Replace("\n", "");
+ return Resources.GitCommit.Substring(0, TotalBytes).Replace("\r", "").Replace("\n", "").ToString().Trim();
}
public static string GetBuildString()
{
- return PRODUCT + " " + GetVersionString() + " `" + GetBranch() + "@" + GetCommitHash(7) + "`; (" + GetArchitecture() + "; " + GetPlatform() + "); Built on " + GetBuildDate() + " at " + GetBuildTime();
+ return PRODUCT + " " + GetVersionString() + " " + GetBranch() + " (" + GetArchitecture() + "; " + GetPlatform() + "); Built @ " + GetBuildDate() + " " + GetBuildTime();
}
}
}
diff --git a/HorseIsleServer/N00BS/N00BS.csproj.user b/HorseIsleServer/N00BS/N00BS.csproj.user
index 42e8489..1ee8c31 100644
--- a/HorseIsleServer/N00BS/N00BS.csproj.user
+++ b/HorseIsleServer/N00BS/N00BS.csproj.user
@@ -1,7 +1,7 @@
- <_LastSelectedProfileId>C:\Users\User\Documents\git\HISP\HorseIsleServer\N00BS\Properties\PublishProfiles\Win32.pubxml
+ <_LastSelectedProfileId>C:\Users\User\Documents\git\HISP\HorseIsleServer\N00BS\Properties\PublishProfiles\Win64.pubxml
diff --git a/HorseIsleServer/N00BS/Program.cs b/HorseIsleServer/N00BS/Program.cs
index 16728a8..c593c24 100644
--- a/HorseIsleServer/N00BS/Program.cs
+++ b/HorseIsleServer/N00BS/Program.cs
@@ -7,7 +7,6 @@ using HISP.Game.Horse;
using HISP.Game.Items;
using HISP.Game.Services;
using HISP.Game.SwfModules;
-using HISP.Modding;
using HISP.Security;
using HISP.Server;
using HTTP;
@@ -75,7 +74,6 @@ namespace HISP.Noobs
BaseDir = Path.Combine(Environment.GetEnvironmentVariable("APPDATA"), "HISP", "N00BS");
Directory.CreateDirectory(BaseDir);
- ModLoader.ReloadModsFromFilesystem();
// Start Web Server
try
diff --git a/HorseIsleServer/build.py b/HorseIsleServer/build.py
new file mode 100644
index 0000000..2cc8abc
--- /dev/null
+++ b/HorseIsleServer/build.py
@@ -0,0 +1,41 @@
+#!/bin/python3
+import os
+import subprocess
+import date
+import datetime
+import struct
+import binascii
+
+global commit_hash
+global commit_tag
+global commit_branch
+
+
+def derive_version():
+ commit_tag + "." + struct.unpack("h", binascii.unhexlify())
+
+versioning_folder = os.path.join("LibHISP", "Resources", "Versioning")
+if not os.path.exists(versioning_folder):
+ os.mkdir(versioning_folder)
+
+commit_hash = "0"*40
+commit_tag = "v0.0.0"
+commit_branch = "master"
+
+try:
+ commit_hash = subprocess.run(['git', 'rev-parse', '--verify', 'HEAD'], stdout=subprocess.PIPE).stdout.replace(b"\r", b"").replace(b"\n", b"").decode("UTF-8")
+ commit_tag = subprocess.run(['git', 'describe', '--abbrev=0', '--tags'], stdout=subprocess.PIPE).stdout.replace(b"\r", b"").replace(b"\n", b"").decode("UTF-8")
+ commit_branch = subprocess.run(['git', 'branch', '--show-current'], stdout=subprocess.PIPE).stdout.replace(b"\r", b"").replace(b"\n", b"").decode("UTF-8")
+except FileNotFoundError:
+ print("Git not installed")
+
+commit_date = datetime.datetime.now().strftime("%d/%m/%Y")
+commit_time = datetime.datetime.now().strftime("%H:%M:%S")
+
+open(os.path.join(versioning_folder, "GitCommit"), "w").write(commit_hash)
+open(os.path.join(versioning_folder, "GitTag" ), "w").write(commit_tag)
+open(os.path.join(versioning_folder, "GitBranch"), "w").write(commit_branch)
+open(os.path.join(versioning_folder, "BuildDate"), "w").write(commit_date)
+open(os.path.join(versioning_folder, "BuildTime"), "w").write(commit_time)
+
+