Add Town Halls and Mail

This commit is contained in:
SilicaAndPina 2021-02-17 00:38:56 +13:00
parent 7b8583dcea
commit 35afd32d6c
8 changed files with 991 additions and 40 deletions

View file

@ -6,6 +6,7 @@ using HISP.Player;
using HISP.Game.Horse;
using HISP.Game.Inventory;
using HISP.Game.Items;
using HISP.Security;
namespace HISP.Server
{
@ -21,8 +22,8 @@ namespace HISP.Server
db.Open();
string UserTable = "CREATE TABLE Users(Id INT, Username TEXT(16),Email TEXT(128),Country TEXT(128),SecurityQuestion Text(128),SecurityAnswerHash TEXT(128),Age INT,PassHash TEXT(128), Salt TEXT(128),Gender TEXT(16), Admin TEXT(3), Moderator TEXT(3))";
string ExtTable = "CREATE TABLE UserExt(Id INT, X INT, Y INT, LastLogin INT, Money INT, QuestPoints INT, BankBalance DOUBLE, BankInterest DOUBLE, ProfilePage Text(1028),IpAddress TEXT(1028),PrivateNotes Text(1028), CharId INT, ChatViolations INT,Subscriber TEXT(3), SubscribedUntil INT, Experience INT, Tiredness INT, Hunger INT, Thirst INT, FreeMinutes INT)";
string MailTable = "CREATE TABLE Mailbox(IdTo INT, PlayerFrom TEXT(16),Subject TEXT(128), Message Text(1028), TimeSent INT)";
string BuddyTable = "CREATE TABLE BuddyList(Id INT, IdFriend INT, Pending BOOL)";
string MailTable = "CREATE TABLE Mailbox(RandomId INT, IdTo INT, IdFrom INT, Subject TEXT(128), Message Text(1028), TimeSent INT, BeenRead TEXT(3))";
string BuddyTable = "CREATE TABLE BuddyList(Id INT, IdFriend INT, Pending TEXT(3))";
string WorldTable = "CREATE TABLE World(Time INT, Day INT, Year INT)";
string WeatherTable = "CREATE TABLE Weather(Area TEXT(1028), Weather TEXT(64))";
string InventoryTable = "CREATE TABLE Inventory(PlayerID INT, RandomID INT, ItemID INT, Data INT)";
@ -2713,22 +2714,6 @@ namespace HISP.Server
}
}
public static int CheckMailcount(int id)
{
using (MySqlConnection db = new MySqlConnection(ConnectionString))
{
db.Open();
MySqlCommand sqlCommand = db.CreateCommand();
sqlCommand.CommandText = "SELECT COUNT(1) FROM Mailbox WHERE IdTo=@id";
sqlCommand.Parameters.AddWithValue("@id", id);
sqlCommand.Prepare();
Int32 count = Convert.ToInt32(sqlCommand.ExecuteScalar());
sqlCommand.Dispose();
return count;
}
}
public static bool HasJewelry(int playerId)
{
using (MySqlConnection db = new MySqlConnection(ConnectionString))
@ -3803,20 +3788,81 @@ namespace HISP.Server
}
}
public static void AddMail(int toId, string fromName, string subject, string message)
public static Mailbox.Mail[] LoadMailbox(int toId)
{
List<Mailbox.Mail> mailList = new List<Mailbox.Mail>();
using (MySqlConnection db = new MySqlConnection(ConnectionString))
{
db.Open();
MySqlCommand sqlCommand = db.CreateCommand();
sqlCommand.CommandText = "SELECT * FROM Mailbox WHERE IdTo=@toId";
sqlCommand.Parameters.AddWithValue("@toId", toId);
sqlCommand.Prepare();
MySqlDataReader reader = sqlCommand.ExecuteReader();
while(reader.Read())
{
Mailbox.Mail MailMessage = new Mailbox.Mail();
MailMessage.RandomId = RandomID.NextRandomId(reader.GetInt32(0));
MailMessage.ToUser = reader.GetInt32(1);
MailMessage.FromUser = reader.GetInt32(2);
MailMessage.Subject = reader.GetString(3);
MailMessage.Message = reader.GetString(4);
MailMessage.Timestamp = reader.GetInt32(5);
MailMessage.Read = reader.GetString(6) == "YES";
mailList.Add(MailMessage);
}
sqlCommand.Dispose();
}
return mailList.ToArray();
}
public static void ReadAllMail(int toId)
{
using (MySqlConnection db = new MySqlConnection(ConnectionString))
{
db.Open();
MySqlCommand sqlCommand = db.CreateCommand();
int epoch = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
sqlCommand.CommandText = "INSERT INTO Mailbox VALUES(@toId,@from,@subject,@message,@time)";
sqlCommand.CommandText = "UPDATE Mailbox SET BeenRead='YES' WHERE IdTo=@toId";
sqlCommand.Parameters.AddWithValue("@toId", toId);
sqlCommand.Parameters.AddWithValue("@from", fromName);
sqlCommand.Prepare();
sqlCommand.ExecuteNonQuery();
sqlCommand.Dispose();
}
}
public static void DeleteMail(int randomId)
{
using (MySqlConnection db = new MySqlConnection(ConnectionString))
{
db.Open();
MySqlCommand sqlCommand = db.CreateCommand();
sqlCommand.CommandText = "DELETE FROM Mailbox WHERE randomId=@randomId";
sqlCommand.Parameters.AddWithValue("@randomId", randomId);
sqlCommand.Prepare();
sqlCommand.ExecuteNonQuery();
sqlCommand.Dispose();
}
}
public static void AddMail(int randomId, int toId, int fromId, string subject, string message, int timestamp, bool read)
{
using (MySqlConnection db = new MySqlConnection(ConnectionString))
{
db.Open();
MySqlCommand sqlCommand = db.CreateCommand();
sqlCommand.CommandText = "INSERT INTO Mailbox VALUES(@randomId, @toId,@from,@subject,@message,@time,@read)";
sqlCommand.Parameters.AddWithValue("@randomId", randomId);
sqlCommand.Parameters.AddWithValue("@toId", toId);
sqlCommand.Parameters.AddWithValue("@from", fromId);
sqlCommand.Parameters.AddWithValue("@subject", subject);
sqlCommand.Parameters.AddWithValue("@mesasge", message);
sqlCommand.Parameters.AddWithValue("@time", epoch);
sqlCommand.Parameters.AddWithValue("@message", message);
sqlCommand.Parameters.AddWithValue("@time", timestamp);
sqlCommand.Parameters.AddWithValue("@read", read ? "YES" : "NO");
sqlCommand.Prepare();
sqlCommand.ExecuteNonQuery();
sqlCommand.Dispose();
@ -3927,7 +3973,7 @@ namespace HISP.Server
{
db.Open();
MySqlCommand sqlCommand = db.CreateCommand();
sqlCommand.CommandText = "SELECT COUNT(1) FROM BuddyList WHERE Id=@id OR IdFriend=@id AND Pending=false";
sqlCommand.CommandText = "SELECT COUNT(1) FROM BuddyList WHERE Id=@id OR IdFriend=@id AND Pending='NO'";
sqlCommand.Parameters.AddWithValue("@id", id);
sqlCommand.Prepare();
@ -3949,7 +3995,7 @@ namespace HISP.Server
List<int> BuddyList = new List<int>();
MySqlCommand sqlCommand = db.CreateCommand();
sqlCommand.CommandText = "SELECT Id,IdFriend FROM BuddyList WHERE Id=@id OR IdFriend=@id AND Pending=false";
sqlCommand.CommandText = "SELECT Id,IdFriend FROM BuddyList WHERE Id=@id OR IdFriend=@id AND Pending='NO'";
sqlCommand.Parameters.AddWithValue("@id", id);
sqlCommand.Prepare();
MySqlDataReader dataReader = sqlCommand.ExecuteReader();
@ -3975,7 +4021,7 @@ namespace HISP.Server
{
db.Open();
MySqlCommand sqlCommand = db.CreateCommand();
sqlCommand.CommandText = "SELECT COUNT(1) FROM BuddyList WHERE (Id=@id AND IdFriend=@friendId) OR (Id=@friendid AND IdFriend=@Id) AND Pending=true";
sqlCommand.CommandText = "SELECT COUNT(1) FROM BuddyList WHERE (Id=@id AND IdFriend=@friendId) OR (Id=@friendid AND IdFriend=@Id) AND Pending='YES'";
sqlCommand.Parameters.AddWithValue("@id", id);
sqlCommand.Parameters.AddWithValue("@friendId", friendId);
sqlCommand.Prepare();
@ -4020,7 +4066,7 @@ namespace HISP.Server
{
db.Open();
MySqlCommand sqlCommand = db.CreateCommand();
sqlCommand.CommandText = "INSERT INTO BuddyList VALUES(@id,@friendId,true)";
sqlCommand.CommandText = "INSERT INTO BuddyList VALUES(@id,@friendId,'YES')";
sqlCommand.Parameters.AddWithValue("@id", id);
sqlCommand.Parameters.AddWithValue("@friendId", friendId);
sqlCommand.Prepare();
@ -4409,6 +4455,180 @@ namespace HISP.Server
}
}
public static HorseInstance[] GetMostExperiencedHorses()
{
List<HorseInstance> inst = new List<HorseInstance>();
using (MySqlConnection db = new MySqlConnection(ConnectionString))
{
db.Open();
MySqlCommand sqlCommand = db.CreateCommand();
sqlCommand.CommandText = "SELECT * FROM Horses ORDER BY experience DESC LIMIT 25";
sqlCommand.Prepare();
MySqlDataReader reader = sqlCommand.ExecuteReader();
while (reader.Read())
{
inst.Add(ReadHorseInstance(reader));
}
sqlCommand.Dispose();
}
return inst.ToArray();
}
public static int[] GetMinigamePlayers()
{
List<int> userIds = new List<int>();
using (MySqlConnection db = new MySqlConnection(ConnectionString))
{
db.Open();
MySqlCommand sqlCommand = db.CreateCommand();
sqlCommand.CommandText = "SELECT DISTINCT playerId, SUM(timesplayed) OVER (PARTITION BY playerId) AS totalPlays FROM leaderboards ORDER BY totalPlays DESC LIMIT 25";
sqlCommand.Prepare();
MySqlDataReader reader = sqlCommand.ExecuteReader();
while (reader.Read())
{
userIds.Add(reader.GetInt32(0));
}
sqlCommand.Dispose();
}
return userIds.ToArray();
}
public static int[] GetExperiencedPlayers()
{
List<int> userIds = new List<int>();
using (MySqlConnection db = new MySqlConnection(ConnectionString))
{
db.Open();
MySqlCommand sqlCommand = db.CreateCommand();
sqlCommand.CommandText = "SELECT id FROM UserExt ORDER BY Experience DESC LIMIT 25";
sqlCommand.Prepare();
MySqlDataReader reader = sqlCommand.ExecuteReader();
while (reader.Read())
{
userIds.Add(reader.GetInt32(0));
}
sqlCommand.Dispose();
}
return userIds.ToArray();
}
public static int[] GetAdventurousPlayers()
{
List<int> userIds = new List<int>();
using (MySqlConnection db = new MySqlConnection(ConnectionString))
{
db.Open();
MySqlCommand sqlCommand = db.CreateCommand();
sqlCommand.CommandText = "SELECT id FROM UserExt ORDER BY QuestPoints DESC LIMIT 25";
sqlCommand.Prepare();
MySqlDataReader reader = sqlCommand.ExecuteReader();
while (reader.Read())
{
userIds.Add(reader.GetInt32(0));
}
sqlCommand.Dispose();
}
return userIds.ToArray();
}
public static int[] GetRichestPlayers()
{
List<int> userIds = new List<int>();
using (MySqlConnection db = new MySqlConnection(ConnectionString))
{
db.Open();
MySqlCommand sqlCommand = db.CreateCommand();
sqlCommand.CommandText = "SELECT id FROM UserExt ORDER BY Money+BankBalance DESC LIMIT 25";
sqlCommand.Prepare();
MySqlDataReader reader = sqlCommand.ExecuteReader();
while (reader.Read())
{
userIds.Add(reader.GetInt32(0));
}
sqlCommand.Dispose();
}
return userIds.ToArray();
}
public static HorseInstance[] GetMostSpoiledHorses()
{
List<HorseInstance> inst = new List<HorseInstance>();
using (MySqlConnection db = new MySqlConnection(ConnectionString))
{
db.Open();
MySqlCommand sqlCommand = db.CreateCommand();
sqlCommand.CommandText = "SELECT * FROM Horses ORDER BY spoiled DESC LIMIT 100";
sqlCommand.Prepare();
MySqlDataReader reader = sqlCommand.ExecuteReader();
while (reader.Read())
{
inst.Add(ReadHorseInstance(reader));
}
sqlCommand.Dispose();
}
return inst.ToArray();
}
public static HorseInstance[] GetBiggestExpAutoSell()
{
List<HorseInstance> inst = new List<HorseInstance>();
using (MySqlConnection db = new MySqlConnection(ConnectionString))
{
db.Open();
MySqlCommand sqlCommand = db.CreateCommand();
sqlCommand.CommandText = "SELECT * FROM Horses ORDER BY experience DESC LIMIT 50";
sqlCommand.Prepare();
MySqlDataReader reader = sqlCommand.ExecuteReader();
while (reader.Read())
{
inst.Add(ReadHorseInstance(reader));
}
sqlCommand.Dispose();
}
return inst.ToArray();
}
public static HorseInstance[] GetCheapestHorseAutoSell()
{
List<HorseInstance> inst = new List<HorseInstance>();
using (MySqlConnection db = new MySqlConnection(ConnectionString))
{
db.Open();
MySqlCommand sqlCommand = db.CreateCommand();
sqlCommand.CommandText = "SELECT * FROM Horses ORDER BY autoSell LIMIT 100";
sqlCommand.Prepare();
MySqlDataReader reader = sqlCommand.ExecuteReader();
while(reader.Read())
{
inst.Add(ReadHorseInstance(reader));
}
sqlCommand.Dispose();
}
return inst.ToArray();
}
public static int GetPlayerTotalMinigamesPlayed(int playerId)
{
using (MySqlConnection db = new MySqlConnection(ConnectionString))
{
db.Open();
MySqlCommand sqlCommand = db.CreateCommand();
sqlCommand.CommandText = "SELECT SUM(timesplayed) FROM Leaderboards WHERE playerId=@playerId";
sqlCommand.Parameters.AddWithValue("@playerId", playerId);
sqlCommand.Prepare();
int count = Convert.ToInt32(sqlCommand.ExecuteScalar());
sqlCommand.Dispose();
return count;
}
}
public static void AddNewHighscore(int playerId, string gameTitle, int score, string type)
{
using (MySqlConnection db = new MySqlConnection(ConnectionString))

View file

@ -746,9 +746,54 @@ namespace HISP.Server
Map.ModIsleX = gameData.messages.commands.mod_isle.x;
Map.ModIsleY = gameData.messages.commands.mod_isle.y;
// City Hall
Messages.CityHallMenu = gameData.messages.meta.city_hall.menu;
Messages.CityHallMailSendMeta = gameData.messages.meta.city_hall.mail_send_meta;
Messages.CityHallSentMessageFormat = gameData.messages.meta.city_hall.sent_mail;
Messages.CityHallCantAffordPostageMessage = gameData.messages.meta.city_hall.cant_afford_postage;
Messages.CityHallCantFindPlayerMessageFormat = gameData.messages.meta.city_hall.cant_find_player;
Messages.CityHallCheapestAutoSells = gameData.messages.meta.city_hall.auto_sell.top_100_cheapest;
Messages.CityHallCheapestAutoSellHorseEntryFormat = gameData.messages.meta.city_hall.auto_sell.cheap_horse_entry;
Messages.CityHallMostExpAutoSells = gameData.messages.meta.city_hall.auto_sell.top_50_most_exp;
Messages.CityHallMostExpAutoSellHorseEntryFormat = gameData.messages.meta.city_hall.auto_sell.exp_horse_entry;
Messages.CityHallTop25Ranches = gameData.messages.meta.city_hall.ranch_investment.top_25;
Messages.CityHallRanchEntryFormat = gameData.messages.meta.city_hall.ranch_investment.ranch_entry;
Messages.CityHallTop25Players = gameData.messages.meta.city_hall.richest_players.top_25;
Messages.CityHallRichPlayerFormat = gameData.messages.meta.city_hall.richest_players.rich_player_format;
Messages.CityHallTop100SpoiledHorses = gameData.messages.meta.city_hall.spoiled_horses.top_100;
Messages.CityHallSpoiledHorseEntryFormat = gameData.messages.meta.city_hall.spoiled_horses.spoiled_horse_entry;
Messages.CityHallTop25AdventurousPlayers = gameData.messages.meta.city_hall.most_adventurous_players.top_25;
Messages.CityHallAdventurousPlayerEntryFormat = gameData.messages.meta.city_hall.most_adventurous_players.adventurous_player_entry;
Messages.CityHallTop25ExperiencedPlayers = gameData.messages.meta.city_hall.most_experinced_players.top_25;
Messages.CityHallExperiencePlayerEntryFormat = gameData.messages.meta.city_hall.most_experinced_players.experienced_player_entry;
Messages.CityHallTop25MinigamePlayers = gameData.messages.meta.city_hall.most_active_minigame_players.top_25;
Messages.CityHallMinigamePlayerEntryFormat = gameData.messages.meta.city_hall.most_active_minigame_players.minigame_player_entry;
Messages.CityHallTop25ExperiencedHorses = gameData.messages.meta.city_hall.most_experienced_horses.top_25;
Messages.CityHallExperiencedHorseEntryFormat = gameData.messages.meta.city_hall.most_experienced_horses.experienced_horse_entry;
// Mail Messages
Messages.MailReceivedMessage = gameData.messages.meta.mail.mail_received;
Messages.MailSelectFromFollowing = gameData.messages.meta.mail.mail_select;
Messages.MailSe = gameData.messages.meta.mail.mail_se;
Messages.MailReadMetaFormat = gameData.messages.meta.mail.mail_read;
Messages.MailEntryFormat = gameData.messages.meta.mail.mail_entry;
Messages.MailRippedMessage = gameData.messages.meta.mail.mail_ripped;
// Click
Messages.PlayerHereFormat = gameData.messages.player_here;
// Ranch
Messages.RanchUnownedRanchFormat = gameData.messages.meta.ranch.unowned_ranch;
Messages.RanchYouCouldPurchaseThisRanch = gameData.messages.meta.ranch.you_could_purchase_this;

View file

@ -84,11 +84,24 @@ namespace HISP.Server
foreach(GameClient client in ConnectedClients)
if (client.LoggedIn)
{
if (!client.LoggedinUser.MetaPriority)
UpdateArea(client);
Update(client);
byte[] BaseStatsPacketData = PacketBuilder.CreatePlayerData(client.LoggedinUser.Money, GameServer.GetNumberOfPlayers(), client.LoggedinUser.MailBox.UnreadMailCount);
client.SendPacket(BaseStatsPacketData);
}
Database.IncPlayerTirednessForOfflineUsers();
if(totalMinutesElapsed % 60 == 0)
{
foreach (HorseInstance horse in Database.GetMostSpoiledHorses())
{
horse.BasicStats.Tiredness = 1000;
horse.BasicStats.Hunger = 1000;
horse.BasicStats.Thirst = 1000;
}
}
if (totalMinutesElapsed % 5 == 0)
{
@ -1453,6 +1466,56 @@ namespace HISP.Server
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.Money -= 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 6: // Riddle Room
if (dynamicInput.Length >= 2)
{
@ -1724,9 +1787,20 @@ namespace HISP.Server
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.MetaPriority = true;
byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildComposeMailMenu());
sender.SendPacket(metaPacket);
break;
case "3": // Quest Log
sender.LoggedinUser.MetaPriority = true;
byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildQuestLog(sender.LoggedinUser));
metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildQuestLog(sender.LoggedinUser));
sender.SendPacket(metaPacket);
break;
case "4": // View Horse Breeds
@ -1836,6 +1910,36 @@ namespace HISP.Server
}
}
break;
case "14": // Most Valued Ranches
sender.LoggedinUser.MetaPriority = true;
metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildMostValuedRanches());
sender.SendPacket(metaPacket);
break;
case "15": // Most Richest Players
sender.LoggedinUser.MetaPriority = true;
metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildRichestPlayers());
sender.SendPacket(metaPacket);
break;
case "16": // Most Adventurous Players
sender.LoggedinUser.MetaPriority = true;
metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildAdventurousPlayers());
sender.SendPacket(metaPacket);
break;
case "17": // Most Experienced Players
sender.LoggedinUser.MetaPriority = true;
metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildExperiencedPlayers());
sender.SendPacket(metaPacket);
break;
case "18": // Best Minigame Players
sender.LoggedinUser.MetaPriority = true;
metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildMinigamePlayers());
sender.SendPacket(metaPacket);
break;
case "19": // Most Experienced Horses
sender.LoggedinUser.MetaPriority = true;
metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildMostExperienedHoses());
sender.SendPacket(metaPacket);
break;
case "20": // Minigame Rankings
sender.LoggedinUser.MetaPriority = true;
metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildMinigameRankingsForUser(sender.LoggedinUser));
@ -1869,6 +1973,11 @@ namespace HISP.Server
sender.SendPacket(metaPacket);
}
break;
case "29": // Auto Sell Horses
sender.LoggedinUser.MetaPriority = true;
metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildTopAutoSellHorses());
sender.SendPacket(metaPacket);
break;
case "31":
sender.LoggedinUser.MetaPriority = true;
metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildRanchSearchLibary());
@ -1938,6 +2047,11 @@ namespace HISP.Server
metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildRanchSellConfirmation());
sender.SendPacket(metaPacket);
break;
case "61": // Most Spoiled Horse
sender.LoggedinUser.MetaPriority = true;
metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildMostSpoiledHorses());
sender.SendPacket(metaPacket);
break;
case "28c1": // Abuse Report
sender.LoggedinUser.MetaPriority = true;
metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildAbuseReportPage());
@ -2256,7 +2370,7 @@ namespace HISP.Server
byte[] SecCodePacket = PacketBuilder.CreateSecCode(user.SecCodeSeeds, user.SecCodeInc, user.Administrator, user.Moderator);
sender.SendPacket(SecCodePacket);
byte[] BaseStatsPacketData = PacketBuilder.CreatePlayerData(user.Money, GameServer.GetNumberOfPlayers(), user.MailBox.MailCount);
byte[] BaseStatsPacketData = PacketBuilder.CreatePlayerData(user.Money, GameServer.GetNumberOfPlayers(), user.MailBox.UnreadMailCount);
sender.SendPacket(BaseStatsPacketData);
UpdateArea(sender);
@ -4993,7 +5107,111 @@ namespace HISP.Server
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.");
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.");
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.MetaPriority = 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.");
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.MetaPriority = 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);

View file

@ -153,6 +153,10 @@ namespace HISP.Server
public const byte ITEM_SELL = 0x3C;
public const byte ITEM_WRAP = 0x17;
public const byte ITEM_SELL_ALL = 0x3D;
public const byte ITEM_VIEW = 0x2A;
public const byte ITEM_LOOK = 0x4C;
public const byte ITEM_READ = 0x52;
public const byte ITEM_RIP = 0x2B;
public const byte ITEM_OPEN = 0x16;
public const byte ITEM_WEAR = 0x46;
public const byte ITEM_REMOVE = 0x47;