diff --git a/DataCollection/gamedata.json b/DataCollection/gamedata.json
index e2edd54..6a0075e 100644
--- a/DataCollection/gamedata.json
+++ b/DataCollection/gamedata.json
@@ -138,15 +138,14 @@
"npc_talk_button":"^BA%ID%"
},
"inventory":{
- "full_inventory_grab":"Your inventory is full! Cannot grab items.",
- "full_inventory_buy":"Your inventory is full! Cannot grab items.",
-
+ "equip_format":"The %ITEM% are now selected as competition gear.",
"header_format":"^ATYour Inventory^HYou are carrying the following %ITEMCOUNT% different items: (%MAXITEMS% max)",
"item_entry":"^I%ICONID%^T4(%COUNT%) %TITLE%",
"shop_entry":"^I%ICONID%^T4(%COUNT%) %TITLE% $%PRICE%",
"item_drop_button":"^B4D%RANDOMID%",
"item_info_button":"^B4LE%RANDOMID%",
"item_info_itemid_button":"^B4LN%ITEMID%",
+ "item_wear_button":"^B4W%RANDOMID%",
"item_consume_button":"^B4E%RANDOMID%",
"item_throw_button":"^B4T%RANDOMID%",
"item_use_button":"^B4UD%RANDOMID%",
diff --git a/Horse Isle Server/Horse Isle Server/Game/Item.cs b/Horse Isle Server/Horse Isle Server/Game/Item.cs
index 1563b2a..184a2e0 100644
--- a/Horse Isle Server/Horse Isle Server/Game/Item.cs
+++ b/Horse Isle Server/Horse Isle Server/Game/Item.cs
@@ -18,7 +18,7 @@ namespace HISP.Game
public string SpawnOnSpecialTile;
public string SpawnNearSpecialTile;
}
- public struct ItemInformation
+ public class ItemInformation
{
public int Id;
public string Name;
@@ -55,7 +55,6 @@ namespace HISP.Game
public static int Telescope;
public static int Pitchfork;
-
public static bool IsThrowable(int id)
{
foreach(ThrowableItem itm in ThrowableItems)
diff --git a/Horse Isle Server/Horse Isle Server/Game/Messages.cs b/Horse Isle Server/Horse Isle Server/Game/Messages.cs
index 5cc3735..16d5726 100644
--- a/Horse Isle Server/Horse Isle Server/Game/Messages.cs
+++ b/Horse Isle Server/Horse Isle Server/Game/Messages.cs
@@ -105,7 +105,7 @@ namespace HISP.Game
// Inventory
public static string InventoryItemFormat;
-
+ public static string EquipItemFormat;
public static string InventoryHeaderFormat;
public static string ItemDropButton;
@@ -114,6 +114,7 @@ namespace HISP.Game
public static string ItemConsumeButton;
public static string ItemThrowButton;
public static string ItemUseButton;
+ public static string ItemWearButton;
public static string ItemReadButton;
public static string ShopEntryFormat;
@@ -240,7 +241,10 @@ namespace HISP.Game
}
-
+ public static string FormatEquipItemMessage(string name)
+ {
+ return EquipItemFormat.Replace("%ITEM%", name);
+ }
public static string FormatYouEarnedAnItemMessage(string itemName)
{
return YouEarnedAnItemFormat.Replace("%ITEM%", itemName);
@@ -269,7 +273,10 @@ namespace HISP.Game
{
return ShopEntryFormat.Replace("%ICONID%", iconid.ToString()).Replace("%COUNT%", count).Replace("%TITLE%", name).Replace("%PRICE%", price.ToString());
}
-
+ public static string FormatWearButton(int randomId)
+ {
+ return ItemWearButton.Replace("%RANDOMID%", randomId.ToString());
+ }
public static string FormatItemInformationByIdButton(int itemId)
{
return ItemInformationByIdButton.Replace("%ITEMID%", itemId.ToString());
diff --git a/Horse Isle Server/Horse Isle Server/Game/Meta.cs b/Horse Isle Server/Horse Isle Server/Game/Meta.cs
index 8b0718f..98f329f 100644
--- a/Horse Isle Server/Horse Isle Server/Game/Meta.cs
+++ b/Horse Isle Server/Horse Isle Server/Game/Meta.cs
@@ -336,6 +336,9 @@ namespace HISP.Game
if (itemInfo.Id == Item.Present || itemInfo.Id == Item.DorothyShoes || itemInfo.Id == Item.Telescope)
message += Messages.FormatItemUseButton(randomId);
+ if (itemInfo.Type == "CLOTHES")
+ message += Messages.FormatWearButton(randomId);
+
if (itemInfo.Type == "TEXT")
message += Messages.FormatItemReadButton(randomId);
diff --git a/Horse Isle Server/Horse Isle Server/Horse Isle Server.csproj b/Horse Isle Server/Horse Isle Server/Horse Isle Server.csproj
index b59d322..13faa9b 100644
--- a/Horse Isle Server/Horse Isle Server/Horse Isle Server.csproj
+++ b/Horse Isle Server/Horse Isle Server/Horse Isle Server.csproj
@@ -77,6 +77,7 @@
+
True
True
diff --git a/Horse Isle Server/Horse Isle Server/Player/CompetitionGear.cs b/Horse Isle Server/Horse Isle Server/Player/CompetitionGear.cs
new file mode 100644
index 0000000..b9a7ccb
--- /dev/null
+++ b/Horse Isle Server/Horse Isle Server/Player/CompetitionGear.cs
@@ -0,0 +1,92 @@
+using HISP.Game;
+using HISP.Server;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HISP.Player
+{
+ class CompetitionGear
+ {
+ private int playerId;
+ public CompetitionGear(int PlayerId)
+ {
+ playerId = PlayerId;
+ if (!Database.HasCompetitionGear(PlayerId))
+ Database.InitCompetitionGear(PlayerId);
+ int itemId = Database.GetCompetitionGearHeadPeice(PlayerId);
+ if (itemId != 0)
+ head = Item.GetItemById(itemId);
+
+ itemId = Database.GetCompetitionGearBodyPeice(PlayerId);
+ if (itemId != 0)
+ body = Item.GetItemById(itemId);
+
+ itemId = Database.GetCompetitionGearLegPeice(PlayerId);
+ if (itemId != 0)
+ legs = Item.GetItemById(itemId);
+
+ itemId = Database.GetCompetitionGearFeetPeice(PlayerId);
+ if (itemId != 0)
+ feet = Item.GetItemById(itemId);
+
+ }
+ public Item.ItemInformation Head
+ {
+ get
+ {
+ return head;
+ }
+ set
+ {
+ Database.SetCompetitionGearHeadPeice(playerId, value.Id);
+ head = value;
+ }
+ }
+ public Item.ItemInformation Body
+ {
+ get
+ {
+ return body;
+ }
+ set
+ {
+ Database.SetCompetitionGearBodyPeice(playerId, value.Id);
+ body = value;
+ }
+ }
+ public Item.ItemInformation Legs
+ {
+ get
+ {
+ return legs;
+ }
+ set
+ {
+ Database.SetCompetitionGearLegPeice(playerId, value.Id);
+ legs = value;
+ }
+ }
+ public Item.ItemInformation Feet
+ {
+ get
+ {
+ return feet;
+ }
+ set
+ {
+ Database.SetCompetitionGearFeetPeice(playerId, value.Id);
+ feet = value;
+ }
+ }
+
+
+ private Item.ItemInformation head;
+ private Item.ItemInformation body;
+ private Item.ItemInformation legs;
+ private Item.ItemInformation feet;
+
+ }
+}
diff --git a/Horse Isle Server/Horse Isle Server/Player/User.cs b/Horse Isle Server/Horse Isle Server/Player/User.cs
index 8f22299..1be9750 100644
--- a/Horse Isle Server/Horse Isle Server/Player/User.cs
+++ b/Horse Isle Server/Horse Isle Server/Player/User.cs
@@ -6,13 +6,14 @@ namespace HISP.Player
{
class User
{
+
public int Id;
public string Username;
public bool Administrator;
public bool Moderator;
public bool NewPlayer = false;
public GameClient LoggedinClient;
-
+ public CompetitionGear EquipedCompetitionGear;
public bool MuteAds = false;
public bool MuteGlobal = false;
public bool MuteIsland = false;
@@ -258,6 +259,9 @@ namespace HISP.Player
NewPlayer = true;
}
+
+ EquipedCompetitionGear = new CompetitionGear(UserId);
+
Id = UserId;
Username = Database.GetUsername(UserId);
@@ -278,13 +282,14 @@ namespace HISP.Player
subscribed = Database.IsUserSubscribed(UserId);
subscribedUntil = Database.GetUserSubscriptionExpireDate(UserId);
profilePage = Database.GetPlayerProfile(UserId);
-
Gender = Database.GetGender(UserId);
MailBox = new Mailbox(this);
+
+
// Generate SecCodes
-
+
SecCodeSeeds[0] = (byte)GameServer.RandomNumberGenerator.Next(40, 60);
SecCodeSeeds[1] = (byte)GameServer.RandomNumberGenerator.Next(40, 60);
SecCodeSeeds[2] = (byte)GameServer.RandomNumberGenerator.Next(40, 60);
diff --git a/Horse Isle Server/Horse Isle Server/Server/Database.cs b/Horse Isle Server/Horse Isle Server/Server/Database.cs
index fb9e86a..ec4f5ed 100644
--- a/Horse Isle Server/Horse Isle Server/Server/Database.cs
+++ b/Horse Isle Server/Horse Isle Server/Server/Database.cs
@@ -25,9 +25,11 @@ namespace HISP.Server
string DroppedItems = "CREATE TABLE DroppedItems(X INT, Y INT, RandomID INT, ItemID INT, DespawnTimer INT)";
string TrackedQuest = "CREATE TABLE TrackedQuest(playerId INT, questId INT, timesCompleted INT)";
string OnlineUsers = "CREATE TABLE OnlineUsers(playerId INT, Admin TEXT(3), Moderator TEXT(3), Subscribed TEXT(3))";
+ string CompetitionGear = "CREATE TABLE CompetitionGear(playerId INT, headItem INT, bodyItem INT, legItem INT, feetItem INT)";
string DeleteOnlineUsers = "DELETE FROM OnlineUsers";
+
try
{
@@ -79,7 +81,6 @@ namespace HISP.Server
Logger.WarnPrint(e.Message);
};
-
try
{
@@ -130,6 +131,20 @@ namespace HISP.Server
{
Logger.WarnPrint(e.Message);
};
+
+ try
+ {
+
+ MySqlCommand sqlCommand = db.CreateCommand();
+ sqlCommand.CommandText = CompetitionGear;
+ sqlCommand.ExecuteNonQuery();
+ sqlCommand.Dispose();
+ }
+ catch (Exception e)
+ {
+ Logger.WarnPrint(e.Message);
+ };
+
try
{
@@ -297,6 +312,167 @@ namespace HISP.Server
}
}
+ public static bool HasCompetitionGear(int playerId)
+ {
+ using (MySqlConnection db = new MySqlConnection(ConnectionString))
+ {
+ db.Open();
+ MySqlCommand sqlCommand = db.CreateCommand();
+
+ sqlCommand.CommandText = "SELECT COUNT(1) FROM competitionGear WHERE playerId=@playerId";
+ sqlCommand.Parameters.AddWithValue("@playerId", playerId);
+
+ sqlCommand.Prepare();
+ int timesComplete = Convert.ToInt32(sqlCommand.ExecuteScalar());
+ sqlCommand.Dispose();
+ return timesComplete > 0;
+ }
+ }
+
+ public static void InitCompetitionGear(int playerId)
+ {
+ using (MySqlConnection db = new MySqlConnection(ConnectionString))
+ {
+ db.Open();
+ MySqlCommand sqlCommand = db.CreateCommand();
+
+ sqlCommand.CommandText = "INSERT INTO competitionGear VALUES(@playerId,0,0,0,0)";
+ sqlCommand.Parameters.AddWithValue("@playerId", playerId);
+
+ sqlCommand.Prepare();
+ sqlCommand.ExecuteNonQuery();
+ sqlCommand.Dispose();
+ }
+ }
+
+ public static void SetCompetitionGearHeadPeice(int playerId, int itemId)
+ {
+ using (MySqlConnection db = new MySqlConnection(ConnectionString))
+ {
+ db.Open();
+ MySqlCommand sqlCommand = db.CreateCommand();
+
+ sqlCommand.CommandText = "UPDATE competitionGear SET headItem=@itemId WHERE playerId=@playerId";
+ sqlCommand.Parameters.AddWithValue("@playerId", playerId);
+ sqlCommand.Parameters.AddWithValue("@itemId", itemId);
+
+ sqlCommand.Prepare();
+ sqlCommand.ExecuteNonQuery();
+ sqlCommand.Dispose();
+ }
+ }
+ public static int GetCompetitionGearHeadPeice(int playerId)
+ {
+ using (MySqlConnection db = new MySqlConnection(ConnectionString))
+ {
+ db.Open();
+ MySqlCommand sqlCommand = db.CreateCommand();
+
+ sqlCommand.CommandText = "SELECT headItem FROM competitionGear WHERE playerId=@playerId";
+ sqlCommand.Parameters.AddWithValue("@playerId", playerId);
+ sqlCommand.Prepare();
+ int timesComplete = Convert.ToInt32(sqlCommand.ExecuteScalar());
+ sqlCommand.Dispose();
+ return timesComplete;
+ }
+ }
+
+ public static void SetCompetitionGearBodyPeice(int playerId, int itemId)
+ {
+ using (MySqlConnection db = new MySqlConnection(ConnectionString))
+ {
+ db.Open();
+ MySqlCommand sqlCommand = db.CreateCommand();
+
+ sqlCommand.CommandText = "UPDATE competitionGear SET bodyItem=@itemId WHERE playerId=@playerId";
+ sqlCommand.Parameters.AddWithValue("@playerId", playerId);
+ sqlCommand.Parameters.AddWithValue("@itemId", itemId);
+
+ sqlCommand.Prepare();
+ sqlCommand.ExecuteNonQuery();
+ sqlCommand.Dispose();
+ }
+ }
+ public static int GetCompetitionGearBodyPeice(int playerId)
+ {
+ using (MySqlConnection db = new MySqlConnection(ConnectionString))
+ {
+ db.Open();
+ MySqlCommand sqlCommand = db.CreateCommand();
+
+ sqlCommand.CommandText = "SELECT bodyItem FROM competitionGear WHERE playerId=@playerId";
+ sqlCommand.Parameters.AddWithValue("@playerId", playerId);
+ sqlCommand.Prepare();
+ int timesComplete = Convert.ToInt32(sqlCommand.ExecuteScalar());
+ sqlCommand.Dispose();
+ return timesComplete;
+ }
+ }
+
+ public static void SetCompetitionGearLegPeice(int playerId, int itemId)
+ {
+ using (MySqlConnection db = new MySqlConnection(ConnectionString))
+ {
+ db.Open();
+ MySqlCommand sqlCommand = db.CreateCommand();
+
+ sqlCommand.CommandText = "UPDATE competitionGear SET legItem=@itemId WHERE playerId=@playerId";
+ sqlCommand.Parameters.AddWithValue("@playerId", playerId);
+ sqlCommand.Parameters.AddWithValue("@itemId", itemId);
+
+ sqlCommand.Prepare();
+ sqlCommand.ExecuteNonQuery();
+ sqlCommand.Dispose();
+ }
+ }
+ public static int GetCompetitionGearLegPeice(int playerId)
+ {
+ using (MySqlConnection db = new MySqlConnection(ConnectionString))
+ {
+ db.Open();
+ MySqlCommand sqlCommand = db.CreateCommand();
+
+ sqlCommand.CommandText = "SELECT legItem FROM competitionGear WHERE playerId=@playerId";
+ sqlCommand.Parameters.AddWithValue("@playerId", playerId);
+ sqlCommand.Prepare();
+ int timesComplete = Convert.ToInt32(sqlCommand.ExecuteScalar());
+ sqlCommand.Dispose();
+ return timesComplete;
+ }
+ }
+
+ public static void SetCompetitionGearFeetPeice(int playerId, int itemId)
+ {
+ using (MySqlConnection db = new MySqlConnection(ConnectionString))
+ {
+ db.Open();
+ MySqlCommand sqlCommand = db.CreateCommand();
+
+ sqlCommand.CommandText = "UPDATE competitionGear SET feetItem=@itemId WHERE playerId=@playerId";
+ sqlCommand.Parameters.AddWithValue("@playerId", playerId);
+ sqlCommand.Parameters.AddWithValue("@itemId", itemId);
+
+ sqlCommand.Prepare();
+ sqlCommand.ExecuteNonQuery();
+ sqlCommand.Dispose();
+ }
+ }
+ public static int GetCompetitionGearFeetPeice(int playerId)
+ {
+ using (MySqlConnection db = new MySqlConnection(ConnectionString))
+ {
+ db.Open();
+ MySqlCommand sqlCommand = db.CreateCommand();
+
+ sqlCommand.CommandText = "SELECT feetItem FROM competitionGear WHERE playerId=@playerId";
+ sqlCommand.Parameters.AddWithValue("@playerId", playerId);
+ sqlCommand.Prepare();
+ int timesComplete = Convert.ToInt32(sqlCommand.ExecuteScalar());
+ sqlCommand.Dispose();
+ return timesComplete;
+ }
+ }
+
public static int GetTrackedQuestCompletedCount(int playerId, int questId)
{
if(CheckTrackeQuestExists(playerId,questId))
diff --git a/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs b/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs
index af0b683..6de8764 100644
--- a/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs
+++ b/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs
@@ -537,6 +537,7 @@ namespace HISP.Server
Messages.ItemThrowButton = gameData.messages.meta.inventory.item_throw_button;
Messages.ItemConsumeButton = gameData.messages.meta.inventory.item_consume_button;
Messages.ItemUseButton = gameData.messages.meta.inventory.item_use_button;
+ Messages.ItemWearButton = gameData.messages.meta.inventory.item_wear_button;
Messages.ItemReadButton = gameData.messages.meta.inventory.item_read_button;
Messages.ShopBuyButton = gameData.messages.meta.inventory.buy_button;
@@ -585,6 +586,7 @@ namespace HISP.Server
// Inventory
Messages.DefaultInventoryMax = gameData.item.max_carryable;
+ Messages.EquipItemFormat = gameData.messages.meta.inventory.equip_format;
// Click
Messages.NothingInterestingHere = gameData.messages.click_nothing_message;
diff --git a/Horse Isle Server/Horse Isle Server/Server/GameServer.cs b/Horse Isle Server/Horse Isle Server/Server/GameServer.cs
index 043abac..e9ce69c 100644
--- a/Horse Isle Server/Horse Isle Server/Server/GameServer.cs
+++ b/Horse Isle Server/Horse Isle Server/Server/GameServer.cs
@@ -790,6 +790,90 @@ namespace HISP.Server
}
break;
+ case PacketBuilder.ITEM_WEAR:
+ const int MISC_FLAG_HEAD = 1;
+ const int MISC_FLAG_BODY = 2;
+ const int MISC_FLAG_LEGS = 3;
+ const int MISC_FLAG_FEET = 4;
+
+ packetStr = Encoding.UTF8.GetString(packet);
+ randomIdStr = packetStr.Substring(2, packet.Length - 2);
+ randomId = 0;
+
+ try
+ {
+ randomId = Int32.Parse(randomIdStr);
+ }
+ catch (InvalidOperationException)
+ {
+ Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object interaction 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 itemInf = instance.GetItemInfo();
+ switch(itemInf.MiscFlags[0])
+ {
+ case 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 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 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 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;
+ }
+
+
+
+
+ byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatEquipItemMessage(itemInf.Name), 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_DROP:
packetStr = Encoding.UTF8.GetString(packet);
randomIdStr = packetStr.Substring(2, packet.Length - 2);
diff --git a/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs b/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs
index 848493d..c4085a1 100644
--- a/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs
+++ b/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs
@@ -29,6 +29,7 @@ namespace HISP.Server
public const byte PACKET_KEEP_ALIVE = 0x7C;
public const byte PACKET_PLAYER = 0x18;
public const byte PACKET_INVENTORY = 0x17;
+ public const byte ITEM_WEAR = 0x46;
public const byte PACKET_TRANSPORT = 0x29;
public const byte PACKET_KICK = 0x80;
public const byte PACKET_LEAVE = 0x7D;