diff --git a/FFXIVClassic Common Class Lib/Properties/AssemblyInfo.cs b/FFXIVClassic Common Class Lib/Properties/AssemblyInfo.cs index 79f8aa4e..0d9a897b 100644 --- a/FFXIVClassic Common Class Lib/Properties/AssemblyInfo.cs +++ b/FFXIVClassic Common Class Lib/Properties/AssemblyInfo.cs @@ -1,5 +1,4 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following diff --git a/FFXIVClassic Common Class Lib/Sql.cs b/FFXIVClassic Common Class Lib/Sql.cs index 2de92bc0..ace44be3 100644 --- a/FFXIVClassic Common Class Lib/Sql.cs +++ b/FFXIVClassic Common Class Lib/Sql.cs @@ -1,12 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using MySql.Data.MySqlClient; -using NLog; -using System.Data; -using System.Data.Common; +using NLog; namespace FFXIVClassic.Common { diff --git a/FFXIVClassic Common Class Lib/SubPacket.cs b/FFXIVClassic Common Class Lib/SubPacket.cs index 585e5c6b..1f9e38cb 100644 --- a/FFXIVClassic Common Class Lib/SubPacket.cs +++ b/FFXIVClassic Common Class Lib/SubPacket.cs @@ -1,6 +1,5 @@ using System; using System.Runtime.InteropServices; -using FFXIVClassic.Common; using NLog; using NLog.Targets; diff --git a/FFXIVClassic Common Class Lib/Utils.cs b/FFXIVClassic Common Class Lib/Utils.cs index aa8ddaf5..fb4db252 100644 --- a/FFXIVClassic Common Class Lib/Utils.cs +++ b/FFXIVClassic Common Class Lib/Utils.cs @@ -139,6 +139,12 @@ namespace FFXIVClassic.Common return input; } + public static ushort SwapEndian(ushort input) + { + return (ushort)(((input << 8) & 0xff00) | + ((input >> 8) & 0x00ff)); + } + public static uint MurmurHash2(string key, uint seed) { // 'm' and 'r' are mixing constants generated offline. diff --git a/FFXIVClassic Lobby Server/Database.cs b/FFXIVClassic Lobby Server/Database.cs index cd17e498..0a29e2d6 100644 --- a/FFXIVClassic Lobby Server/Database.cs +++ b/FFXIVClassic Lobby Server/Database.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Linq; using FFXIVClassic_Lobby_Server.utils; -using FFXIVClassic.Common; namespace FFXIVClassic_Lobby_Server { diff --git a/FFXIVClassic Lobby Server/Program.cs b/FFXIVClassic Lobby Server/Program.cs index 2d14bb84..a5ce58fe 100644 --- a/FFXIVClassic Lobby Server/Program.cs +++ b/FFXIVClassic Lobby Server/Program.cs @@ -2,8 +2,6 @@ using System.Diagnostics; using System.Threading; using MySql.Data.MySqlClient; -using System.Reflection; -using FFXIVClassic.Common; using NLog; namespace FFXIVClassic_Lobby_Server { diff --git a/FFXIVClassic Lobby Server/Server.cs b/FFXIVClassic Lobby Server/Server.cs index 93cd8639..408ffa89 100644 --- a/FFXIVClassic Lobby Server/Server.cs +++ b/FFXIVClassic Lobby Server/Server.cs @@ -5,7 +5,6 @@ using System.Net.Sockets; using System.Threading; using FFXIVClassic.Common; -using NLog; namespace FFXIVClassic_Lobby_Server { diff --git a/FFXIVClassic Map Server/CommandProcessor.cs b/FFXIVClassic Map Server/CommandProcessor.cs index 447bfd57..93e80cd3 100644 --- a/FFXIVClassic Map Server/CommandProcessor.cs +++ b/FFXIVClassic Map Server/CommandProcessor.cs @@ -1,11 +1,9 @@ using System; using System.Collections.Generic; using System.Linq; -using FFXIVClassic.Common; using FFXIVClassic_Map_Server.dataobjects; using System.IO; -using FFXIVClassic_Map_Server.packets.send.actor; using FFXIVClassic_Map_Server.packets.send; using FFXIVClassic_Map_Server.lua; using FFXIVClassic_Map_Server.Actors; diff --git a/FFXIVClassic Map Server/ConfigConstants.cs b/FFXIVClassic Map Server/ConfigConstants.cs index 908914cb..2c225430 100644 --- a/FFXIVClassic Map Server/ConfigConstants.cs +++ b/FFXIVClassic Map Server/ConfigConstants.cs @@ -1,9 +1,6 @@ using FFXIVClassic.Common; using System; -using System.Collections.Generic; using System.IO; -using System.Net.Sockets; -using MoonSharp.Interpreter.Interop; using System.Linq; using System.Net; diff --git a/FFXIVClassic Map Server/Database.cs b/FFXIVClassic Map Server/Database.cs index 41f575ca..98b61751 100644 --- a/FFXIVClassic Map Server/Database.cs +++ b/FFXIVClassic Map Server/Database.cs @@ -1111,12 +1111,12 @@ namespace FFXIVClassic_Map_Server } } - player.GetInventory(Inventory.NORMAL).InitList(GetInventory(player, 0, Inventory.NORMAL)); - player.GetInventory(Inventory.KEYITEMS).InitList(GetInventory(player, 0, Inventory.KEYITEMS)); - player.GetInventory(Inventory.CURRENCY_CRYSTALS).InitList(GetInventory(player, 0, Inventory.CURRENCY_CRYSTALS)); - player.GetInventory(Inventory.BAZAAR).InitList(GetInventory(player, 0, Inventory.BAZAAR)); - player.GetInventory(Inventory.MELDREQUEST).InitList(GetInventory(player, 0, Inventory.MELDREQUEST)); - player.GetInventory(Inventory.LOOT).InitList(GetInventory(player, 0, Inventory.LOOT)); + player.GetItemPackage(ItemPackage.NORMAL).InitList(GetItemPackage(player, 0, ItemPackage.NORMAL)); + player.GetItemPackage(ItemPackage.KEYITEMS).InitList(GetItemPackage(player, 0, ItemPackage.KEYITEMS)); + player.GetItemPackage(ItemPackage.CURRENCY_CRYSTALS).InitList(GetItemPackage(player, 0, ItemPackage.CURRENCY_CRYSTALS)); + player.GetItemPackage(ItemPackage.BAZAAR).InitList(GetBazaar(player)); + player.GetItemPackage(ItemPackage.MELDREQUEST).InitList(GetItemPackage(player, 0, ItemPackage.MELDREQUEST)); + player.GetItemPackage(ItemPackage.LOOT).InitList(GetItemPackage(player, 0, ItemPackage.LOOT)); player.GetEquipment().SetEquipment(GetEquipment(player, player.charaWork.parameterSave.state_mainSkill[0])); } @@ -1159,7 +1159,7 @@ namespace FFXIVClassic_Map_Server { ushort equipSlot = reader.GetUInt16(0); ulong uniqueItemId = reader.GetUInt16(1); - InventoryItem item = player.GetInventory(Inventory.NORMAL).GetItemByUniqueId(uniqueItemId); + InventoryItem item = player.GetItemPackage(ItemPackage.NORMAL).GetItemByUniqueId(uniqueItemId); equipment[equipSlot] = item; } } @@ -1309,7 +1309,7 @@ namespace FFXIVClassic_Map_Server conn.Open(); MySqlCommand cmd; string query = ""; - + query = @" DELETE FROM characters_hotbar WHERE characterId = @charId AND classId = @classId AND hotbarSlot = @hotbarSlot @@ -1435,7 +1435,8 @@ namespace FFXIVClassic_Map_Server } return slot; } - public static List GetInventory(Player player, uint slotOffset, uint type) + + public static List GetItemPackage(Player player, uint slotOffset, uint type) { List items = new List(); @@ -1449,19 +1450,29 @@ namespace FFXIVClassic_Map_Server SELECT serverItemId, itemId, + server_items_modifiers.id AS modifierId, quantity, - itemType, quality, + durability, - spiritBind, + mainQuality, + subQuality1, + subQuality2, + subQuality3, + param1, + param2, + param3, + spiritbind, materia1, materia2, materia3, materia4, materia5 + FROM characters_inventory INNER JOIN server_items ON serverItemId = server_items.id - WHERE characterId = @charId AND inventoryType = @type"; + LEFT JOIN server_items_modifiers ON server_items.id = server_items_modifiers.id + WHERE characterId = @charId AND itemPackage = @type"; MySqlCommand cmd = new MySqlCommand(query, conn); cmd.Parameters.AddWithValue("@charId", player.actorId); @@ -1476,21 +1487,15 @@ namespace FFXIVClassic_Map_Server uint itemId = reader.GetUInt32("itemId"); int quantity = reader.GetInt32("quantity"); - byte itemType = reader.GetByte("itemType"); byte qualityNumber = reader.GetByte("quality"); - int durability = reader.GetInt32("durability"); - ushort spiritBind = reader.GetUInt16("spiritBind"); + bool hasModifier = !reader.IsDBNull(reader.GetOrdinal("modifierId")); + InventoryItem.ItemModifier modifier = null; - byte materia1 = reader.GetByte("materia1"); - byte materia2 = reader.GetByte("materia2"); - byte materia3 = reader.GetByte("materia3"); - byte materia4 = reader.GetByte("materia4"); - byte materia5 = reader.GetByte("materia5"); + if (hasModifier) + modifier = new InventoryItem.ItemModifier(reader); - InventoryItem item = new InventoryItem(uniqueId, itemId, quantity, itemType, qualityNumber, durability, spiritBind, materia1, materia2, materia3, materia4, materia5); - item.slot = slot; - slot++; + InventoryItem item = new InventoryItem(uniqueId, Server.GetItemGamedata(itemId), quantity, qualityNumber, modifier); items.Add(item); } } @@ -1508,6 +1513,247 @@ namespace FFXIVClassic_Map_Server return items; } + public static bool CreateBazaarEntry(Player owner, InventoryItem reward, InventoryItem seek, int rewardAmount, int seekAmount, byte bazaarMode, int sellPrice = 0) + { + using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD))) + { + try + { + conn.Open(); + + string query = @" + INSERT INTO characters_inventory_bazaar + (characterId, rewardId, seekId, rewardAmount, seekAmount, bazaarMode, sellPrice) + VALUES + (@characterId, @rewardId, @seekId, @rewardAmount, @seekAmount, @bazaarMode, @sellPrice); + "; + + MySqlCommand cmd = new MySqlCommand(query, conn); + cmd.Parameters.AddWithValue("@characterId", owner.actorId); + cmd.Parameters.AddWithValue("@rewardId", reward.uniqueId); + cmd.Parameters.AddWithValue("@seekId", seek.uniqueId); + cmd.Parameters.AddWithValue("@rewardAmount", rewardAmount); + cmd.Parameters.AddWithValue("@seekAmount", seekAmount); + cmd.Parameters.AddWithValue("@bazaarMode", bazaarMode); + cmd.Parameters.AddWithValue("@sellPrice", sellPrice); + cmd.ExecuteNonQuery(); + } + catch (MySqlException e) + { + Program.Log.Error(e.ToString()); + return false; + } + finally + { + conn.Dispose(); + } + } + + return true; + } + + public static void ClearBazaarEntry(Player owner, InventoryItem reward) + { + using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}; Allow User Variables=True", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD))) + { + try + { + conn.Open(); + + string query = @" + DELETE FROM characters_inventory_bazaar + WHERE characterId = @charId and rewardId = @rewardId; + "; + + MySqlCommand cmd = new MySqlCommand(query, conn); + cmd.Parameters.AddWithValue("@charId", owner.actorId); + cmd.Parameters.AddWithValue("@rewardId", reward.uniqueId); + cmd.ExecuteNonQuery(); + + } + catch (MySqlException e) + { + Program.Log.Error(e.ToString()); + } + finally + { + conn.Dispose(); + } + } + } + + public static List GetBazaar(Player player) + { + List rewardItems = new List(); + Dictionary seekItems = new Dictionary(); + + using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD))) + { + try + { + conn.Open(); + + string query = @" + SELECT + rewardId, + seekId, + rewardAmount, + bazaarMode, + sellPrice, + itemId, + server_items_modifiers.id AS modifierId, + quantity, + quality, + + durability, + mainQuality, + subQuality1, + subQuality2, + subQuality3, + param1, + param2, + param3, + spiritbind, + materia1, + materia2, + materia3, + materia4, + materia5 + + FROM characters_inventory_bazaar + INNER JOIN server_items ON rewardId = server_items.id + LEFT JOIN server_items_modifiers ON server_items.id = server_items_modifiers.id + WHERE characterId = @charaId"; + + MySqlCommand cmd = new MySqlCommand(query, conn); + cmd.Parameters.AddWithValue("@charaId", player.actorId); + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + uint uniqueId = reader.GetUInt32("rewardId"); + uint itemId = reader.GetUInt32("itemId"); + int quantity = reader.GetInt32("quantity"); + + byte qualityNumber = reader.GetByte("quality"); + + bool hasModifier = !reader.IsDBNull(reader.GetOrdinal("modifierId")); + InventoryItem.ItemModifier modifier = null; + + if (hasModifier) + modifier = new InventoryItem.ItemModifier(reader); + + InventoryItem item = new InventoryItem(uniqueId, Server.GetItemGamedata(itemId), quantity, qualityNumber, modifier); + + byte bazaarMode = reader.GetByte("bazaarMode"); + + if (bazaarMode == InventoryItem.TYPE_SINGLE || bazaarMode == InventoryItem.TYPE_MULTI || bazaarMode == InventoryItem.TYPE_STACK) + { + uint price = (uint)reader.GetInt32("sellPrice"); + item.SetDealing(bazaarMode, (int)price); + } + else + { + uint seekId = reader.GetUInt32("seekId"); + item.SetDealingAttached(bazaarMode, seekId); + } + + rewardItems.Add(item); + } + } + + string query2 = @" + SELECT + seekId, + seekAmount, + sellPrice, + itemId, + server_items_modifiers.id AS modifierId, + quantity, + quality, + + durability, + mainQuality, + subQuality1, + subQuality2, + subQuality3, + param1, + param2, + param3, + spiritbind, + materia1, + materia2, + materia3, + materia4, + materia5 + + FROM characters_inventory_bazaar + INNER JOIN server_items ON seekId = server_items.id + LEFT JOIN server_items_modifiers ON server_items.id = server_items_modifiers.id + WHERE characterId = @charaId and bazaarMode != 11 and bazaarMode != 12 and bazaarMode != 13"; + + MySqlCommand cmd2 = new MySqlCommand(query2, conn); + cmd2.Parameters.AddWithValue("@charaId", player.actorId); + + using (MySqlDataReader reader = cmd2.ExecuteReader()) + { + while (reader.Read()) + { + uint uniqueId = reader.GetUInt32("seekId"); + uint itemId = reader.GetUInt32("itemId"); + int quantity = reader.GetInt32("quantity"); + + byte qualityNumber = reader.GetByte("quality"); + + bool hasModifier = !reader.IsDBNull(reader.GetOrdinal("modifierId")); + InventoryItem.ItemModifier modifier = null; + + if (hasModifier) + modifier = new InventoryItem.ItemModifier(reader); + + InventoryItem item = new InventoryItem(uniqueId, Server.GetItemGamedata(itemId), quantity, qualityNumber, modifier); + item.SetHasAttached(true); + seekItems.Add(uniqueId, item); + } + } + } + catch (MySqlException e) + { + Program.Log.Error(e.ToString()); + } + finally + { + conn.Dispose(); + } + } + + List items = new List(); + ushort slot = 0; + foreach (InventoryItem reward in rewardItems) + { + if (reward.dealingMode == InventoryItem.DEALINGMODE_PRICED) + { + reward.slot = slot++; + items.Add(reward); + } + else + { + if (seekItems.ContainsKey(reward.GetAttached())) + { + reward.slot = slot++; + items.Add(reward); + InventoryItem seek = seekItems[reward.GetAttached()]; + seek.slot = slot++; + items.Add(seek); + reward.SetAttachedIndex(7, seek.slot); + } + } + } + + return items; + } + public static List GetInventory(Retainer retainer, uint type) { List items = new List(); @@ -1522,22 +1768,32 @@ namespace FFXIVClassic_Map_Server SELECT serverItemId, itemId, + server_items_modifiers.id AS modifierId, quantity, - itemType, quality, + durability, - spiritBind, + mainQuality, + subQuality1, + subQuality2, + subQuality3, + param1, + param2, + param3, + spiritbind, materia1, materia2, materia3, materia4, materia5 + FROM retainers_inventory INNER JOIN server_items ON serverItemId = server_items.id - WHERE retainerId = @retainerId AND inventoryType = @type"; + LEFT JOIN server_items_modifiers ON server_items.id = server_items_modifiers.id + WHERE retainerId = @retainerId AND itemPackage = @type"; MySqlCommand cmd = new MySqlCommand(query, conn); - cmd.Parameters.AddWithValue("@retainerId", retainer.getRetainerId()); + cmd.Parameters.AddWithValue("@retainerId", retainer.GetRetainerId()); cmd.Parameters.AddWithValue("@type", type); ushort slot = 0; @@ -1549,21 +1805,15 @@ namespace FFXIVClassic_Map_Server uint itemId = reader.GetUInt32("itemId"); int quantity = reader.GetInt32("quantity"); - byte itemType = reader.GetByte("itemType"); byte qualityNumber = reader.GetByte("quality"); - int durability = reader.GetInt32("durability"); - ushort spiritBind = reader.GetUInt16("spiritBind"); + bool hasModifier = !reader.IsDBNull(reader.GetOrdinal("modifierId")); + InventoryItem.ItemModifier modifier = null; - byte materia1 = reader.GetByte("materia1"); - byte materia2 = reader.GetByte("materia2"); - byte materia3 = reader.GetByte("materia3"); - byte materia4 = reader.GetByte("materia4"); - byte materia5 = reader.GetByte("materia5"); + if (hasModifier) + modifier = new InventoryItem.ItemModifier(reader); - InventoryItem item = new InventoryItem(uniqueId, itemId, quantity, itemType, qualityNumber, durability, spiritBind, materia1, materia2, materia3, materia4, materia5); - item.slot = slot; - slot++; + InventoryItem item = new InventoryItem(uniqueId, Server.GetItemGamedata(itemId), quantity, qualityNumber, modifier); items.Add(item); } } @@ -1581,7 +1831,7 @@ namespace FFXIVClassic_Map_Server return items; } - public static InventoryItem CreateItem(uint itemId, int quantity, byte quality, byte itemType, int durability) + public static InventoryItem CreateItem(uint itemId, int quantity, byte quality, InventoryItem.ItemModifier modifiers = null) { InventoryItem insertedItem = null; @@ -1594,22 +1844,34 @@ namespace FFXIVClassic_Map_Server string query = @" - INSERT INTO server_items - (itemId, quality, itemType, durability) + INSERT INTO server_items + (itemId, quantity, quality) VALUES - (@itemId, @quality, @itemType, @durability); + (@itemId, @quantity, @quality); + "; + + string query2 = @" + INSERT INTO server_items_modifiers + (id, durability) + VALUES + (@id, @durability); "; MySqlCommand cmd = new MySqlCommand(query, conn); - cmd.Parameters.AddWithValue("@itemId", itemId); + cmd.Parameters.AddWithValue("@quantity", quantity); cmd.Parameters.AddWithValue("@quality", quality); - cmd.Parameters.AddWithValue("@itemType", itemType); - cmd.Parameters.AddWithValue("@durability", durability); - cmd.ExecuteNonQuery(); - insertedItem = new InventoryItem((uint)cmd.LastInsertedId, itemId, quantity, itemType, quality, durability, 0, 0, 0, 0, 0, 0); + insertedItem = new InventoryItem((uint)cmd.LastInsertedId, Server.GetItemGamedata(itemId), quantity, quality, modifiers); + + if (modifiers != null) + { + MySqlCommand cmd2 = new MySqlCommand(query2, conn); + cmd2.Parameters.AddWithValue("@id", insertedItem.uniqueId); + cmd2.Parameters.AddWithValue("@durability", modifiers.durability); + cmd2.ExecuteNonQuery(); + } } catch (MySqlException e) { @@ -1625,7 +1887,7 @@ namespace FFXIVClassic_Map_Server } public static void AddItem(Player player, InventoryItem addedItem, uint type) - { + { using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD))) { try @@ -1634,19 +1896,18 @@ namespace FFXIVClassic_Map_Server string query = @" INSERT INTO characters_inventory - (characterId, inventoryType, serverItemId, quantity) + (characterId, itemPackage, serverItemId) VALUES - (@charId, @inventoryType, @serverItemId, @quantity) + (@charId, @itemPackage, @serverItemId) "; MySqlCommand cmd = new MySqlCommand(query, conn); cmd.Parameters.AddWithValue("@serverItemId", addedItem.uniqueId); cmd.Parameters.AddWithValue("@charId", player.actorId); - cmd.Parameters.AddWithValue("@inventoryType", type); - cmd.Parameters.AddWithValue("@quantity", addedItem.quantity); + cmd.Parameters.AddWithValue("@itemPackage", type); - cmd.ExecuteNonQuery(); + cmd.ExecuteNonQuery(); } catch (MySqlException e) { @@ -1659,7 +1920,9 @@ namespace FFXIVClassic_Map_Server } } - public static void SetQuantity(Player player, ulong serverItemId, int quantity) + + + public static void SetQuantity(ulong serverItemId, int quantity) { using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD))) { @@ -1668,13 +1931,12 @@ namespace FFXIVClassic_Map_Server conn.Open(); string query = @" - UPDATE characters_inventory + UPDATE server_items SET quantity = @quantity - WHERE characterId = @charId and serverItemId = @serverItemId; + WHERE id = @serverItemId; "; MySqlCommand cmd = new MySqlCommand(query, conn); - cmd.Parameters.AddWithValue("@charId", player.actorId); cmd.Parameters.AddWithValue("@serverItemId", serverItemId); cmd.Parameters.AddWithValue("@quantity", quantity); cmd.ExecuteNonQuery(); @@ -1720,7 +1982,6 @@ namespace FFXIVClassic_Map_Server conn.Dispose(); } } - } public static void AddItem(Retainer retainer, InventoryItem addedItem, uint type) @@ -1733,17 +1994,16 @@ namespace FFXIVClassic_Map_Server string query = @" INSERT INTO retainers_inventory - (retainerId, inventoryType, serverItemId, quantity) + (retainerId, itemPackage, serverItemId) VALUES - (@retainerId, @inventoryType, @serverItemId, @quantity) + (@retainerId, @itemPackage, @serverItemId) "; MySqlCommand cmd = new MySqlCommand(query, conn); cmd.Parameters.AddWithValue("@serverItemId", addedItem.uniqueId); - cmd.Parameters.AddWithValue("@retainerId", retainer.getRetainerId()); - cmd.Parameters.AddWithValue("@inventoryType", type); - cmd.Parameters.AddWithValue("@quantity", addedItem.quantity); + cmd.Parameters.AddWithValue("@retainerId", retainer.GetRetainerId()); + cmd.Parameters.AddWithValue("@itemPackage", type); cmd.ExecuteNonQuery(); } @@ -1758,39 +2018,6 @@ namespace FFXIVClassic_Map_Server } } - public static void SetQuantity(Retainer retainer, ulong serverItemId, int quantity) - { - using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD))) - { - try - { - conn.Open(); - - string query = @" - UPDATE retainers_inventory - SET quantity = @quantity - WHERE retainerId = @retainerId and serverItemId = @serverItemId; - "; - - MySqlCommand cmd = new MySqlCommand(query, conn); - cmd.Parameters.AddWithValue("@retainerId", retainer.getRetainerId()); - cmd.Parameters.AddWithValue("@serverItemId", serverItemId); - cmd.Parameters.AddWithValue("@quantity", quantity); - cmd.ExecuteNonQuery(); - - } - catch (MySqlException e) - { - Program.Log.Error(e.ToString()); - } - finally - { - conn.Dispose(); - } - } - - } - public static void RemoveItem(Retainer retainer, ulong serverItemId) { using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}; Allow User Variables=True", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD))) @@ -1805,7 +2032,7 @@ namespace FFXIVClassic_Map_Server "; MySqlCommand cmd = new MySqlCommand(query, conn); - cmd.Parameters.AddWithValue("@retainerId", retainer.getRetainerId()); + cmd.Parameters.AddWithValue("@retainerId", retainer.GetRetainerId()); cmd.Parameters.AddWithValue("@serverItemId", serverItemId); cmd.ExecuteNonQuery(); @@ -2619,7 +2846,7 @@ namespace FFXIVClassic_Map_Server MySqlCommand cmd = new MySqlCommand(query, conn); cmd.Parameters.AddWithValue("@charaId", player.actorId); - cmd.Parameters.AddWithValue("@retainerIndex", retainerIndex-1); + cmd.Parameters.AddWithValue("@retainerIndex", retainerIndex - 1); using (MySqlDataReader reader = cmd.ExecuteReader()) { @@ -2651,5 +2878,85 @@ namespace FFXIVClassic_Map_Server } } + public static void PlayerCharacterUpdateClassLevel(Player player, byte classId, short level) + { + string query; + MySqlCommand cmd; + + string[] classNames = { + "", + "", + "pug", + "gla", + "mrd", + "", + "", + "arc", + "lnc", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "thm", + "cnj", + "", + "", + "", + "", + "", + "crp", + "bsm", + "arm", + "gsm", + "ltw", + "wvr", + "alc", + "cul", + "", + "", + "min", + "btn", + "fsh" + }; + + using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD))) + { + try + { + conn.Open(); + + query = String.Format(@" + UPDATE characters_class_levels + SET + {0}=@level + WHERE + characterId = @characterId", classNames[classId]); + + cmd = new MySqlCommand(query, conn); + cmd.Parameters.AddWithValue("@level", level); + cmd.Parameters.AddWithValue("@characterId", player.actorId); + + cmd.ExecuteNonQuery(); + } + catch (MySqlException e) + { + Program.Log.Error(e.ToString()); + } + finally + { + conn.Dispose(); + } + } + } + } } diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj index 63fe6bca..14905e16 100644 --- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj +++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj @@ -150,23 +150,25 @@ + - - - - - - + + + + + + + @@ -202,6 +204,7 @@ + @@ -361,6 +364,7 @@ + diff --git a/FFXIVClassic Map Server/PacketProcessor.cs b/FFXIVClassic Map Server/PacketProcessor.cs index e0ebcbdf..a47c4cea 100644 --- a/FFXIVClassic Map Server/PacketProcessor.cs +++ b/FFXIVClassic Map Server/PacketProcessor.cs @@ -1,9 +1,6 @@ using FFXIVClassic.Common; using System; -using System.Collections.Generic; -using System.IO; -using System.Text; using FFXIVClassic_Map_Server.dataobjects; using FFXIVClassic_Map_Server.packets.receive; using FFXIVClassic_Map_Server.packets.send; @@ -88,6 +85,11 @@ namespace FFXIVClassic_Map_Server PartySyncPacket partySyncPacket = new PartySyncPacket(subpacket.data); Server.GetWorldManager().PartyMemberListRecieved(partySyncPacket); break; + //World Server - Linkshell Creation Result + case 0x1025: + LinkshellResultPacket lsResult = new LinkshellResultPacket(subpacket.data); + LuaEngine.GetInstance().OnSignal("ls_result", lsResult.resultCode); + break; //Ping case 0x0001: //subpacket.DebugPrintSubPacket(); @@ -176,11 +178,6 @@ namespace FFXIVClassic_Map_Server Actor ownerActor = Server.GetStaticActors(eventStart.scriptOwnerActorID); - - session.GetActor().currentEventOwner = eventStart.scriptOwnerActorID; - session.GetActor().currentEventName = eventStart.triggerName; - - if (ownerActor == null) { //Is it your retainer? @@ -188,7 +185,7 @@ namespace FFXIVClassic_Map_Server ownerActor = session.GetActor().currentSpawnedRetainer; //Is it a instance actor? if (ownerActor == null) - ownerActor = session.GetActor().zone.FindActorInArea(session.GetActor().currentEventOwner); + ownerActor = session.GetActor().zone.FindActorInArea(eventStart.scriptOwnerActorID); if (ownerActor == null) { //Is it a Director? @@ -246,6 +243,17 @@ namespace FFXIVClassic_Map_Server if (paramRequest.paramName.Equals("charaWork/exp")) session.GetActor().SendCharaExpInfo(); break; + //Item Package Request + case 0x0131: + UpdateItemPackagePacket packageRequest = new UpdateItemPackagePacket(subpacket.data); + if (Server.GetWorldManager().GetActorInWorld(packageRequest.actorID) != null) + { + ((Character)Server.GetWorldManager().GetActorInWorld(packageRequest.actorID)).SendItemPackage(session.GetActor(), packageRequest.packageId); + break; + } + if (session.GetActor().GetSpawnedRetainer() != null && session.GetActor().GetSpawnedRetainer().actorId == packageRequest.actorID) + session.GetActor().GetSpawnedRetainer().SendItemPackage(session.GetActor(), packageRequest.packageId); + break; //Group Created Confirm case 0x0133: GroupCreatedPacket groupCreated = new GroupCreatedPacket(subpacket.data); diff --git a/FFXIVClassic Map Server/Program.cs b/FFXIVClassic Map Server/Program.cs index 1954b553..08549016 100644 --- a/FFXIVClassic Map Server/Program.cs +++ b/FFXIVClassic Map Server/Program.cs @@ -1,15 +1,7 @@ using System; using System.Diagnostics; -using System.Threading; -using System.Text; using MySql.Data.MySqlClient; -using System.Reflection; -using FFXIVClassic_Map_Server.dataobjects; -using FFXIVClassic.Common; using NLog; -using NLog.Targets; -using NLog.Targets.Wrappers; -using NLog.Config; namespace FFXIVClassic_Map_Server { diff --git a/FFXIVClassic Map Server/Server.cs b/FFXIVClassic Map Server/Server.cs index 97f201f5..3dcbf501 100644 --- a/FFXIVClassic Map Server/Server.cs +++ b/FFXIVClassic Map Server/Server.cs @@ -6,7 +6,6 @@ using FFXIVClassic_Map_Server.dataobjects; using FFXIVClassic.Common; using FFXIVClassic_Map_Server.Actors; -using FFXIVClassic_Map_Server.lua; namespace FFXIVClassic_Map_Server { diff --git a/FFXIVClassic Map Server/WorldManager.cs b/FFXIVClassic Map Server/WorldManager.cs index 8bd9a058..86e908e5 100644 --- a/FFXIVClassic Map Server/WorldManager.cs +++ b/FFXIVClassic Map Server/WorldManager.cs @@ -1,30 +1,24 @@ -using FFXIVClassic_Map_Server; -using FFXIVClassic.Common; +using FFXIVClassic.Common; using FFXIVClassic_Map_Server.actors.area; using FFXIVClassic_Map_Server.actors.chara.npc; using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.dataobjects; -using FFXIVClassic_Map_Server.dataobjects.chara; using FFXIVClassic_Map_Server.lua; using FFXIVClassic_Map_Server.packets.send; using FFXIVClassic_Map_Server.packets.send.actor; -using FFXIVClassic_Map_Server.packets.send.login; using MySql.Data.MySqlClient; using System; using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; using FFXIVClassic_Map_Server.actors.group; -using FFXIVClassic_Map_Server.packets.send.group; using FFXIVClassic_Map_Server.packets.WorldPackets.Receive; using FFXIVClassic_Map_Server.packets.WorldPackets.Send.Group; using System.Threading; -using System.Diagnostics; using FFXIVClassic_Map_Server.actors.director; using FFXIVClassic_Map_Server.actors.chara.ai; using FFXIVClassic_Map_Server.actors.chara; using FFXIVClassic_Map_Server.Actors.Chara; +using FFXIVClassic_Map_Server.actors.chara.player; namespace FFXIVClassic_Map_Server { @@ -51,9 +45,12 @@ namespace FFXIVClassic_Map_Server private const int MILIS_LOOPTIME = 333; private Timer mZoneTimer; - //Content Groups + //Zone Server Groups public Dictionary mContentGroups = new Dictionary(); + public Dictionary mRelationGroups = new Dictionary(); + public Dictionary mTradeGroups = new Dictionary(); private Object groupLock = new Object(); + private Object tradeLock = new Object(); public ulong groupIndexId = 1; public WorldManager(Server server) @@ -1032,9 +1029,7 @@ namespace FFXIVClassic_Map_Server player.SendInstanceUpdate(); player.playerSession.LockUpdates(false); - - - + LuaEngine.GetInstance().CallLuaFunction(player, contentArea, "onZoneIn", true); } @@ -1185,6 +1180,332 @@ namespace FFXIVClassic_Map_Server } } + public RelationGroup CreateRelationGroup(Actor inviter, Actor invitee, ulong groupType) + { + lock (groupLock) + { + groupIndexId = groupIndexId | 0x0000000000000000; + + RelationGroup group = new RelationGroup(groupIndexId, inviter.actorId, invitee.actorId, 0, groupType); + mRelationGroups.Add(groupIndexId, group); + groupIndexId++; + + group.SendGroupPacketsAll(inviter.actorId, invitee.actorId); + + return group; + } + } + + public RelationGroup GetRelationGroup(uint actorId) + { + lock (groupLock) + { + foreach (RelationGroup relation in mRelationGroups.Values) + { + if (relation.GetHost() == actorId || relation.GetOther() == actorId) + return relation; + } + return null; + } + } + + public void DeleteRelationGroup(ulong groupid) + { + lock (groupLock) + { + if (mRelationGroups.ContainsKey(groupid)) + mRelationGroups.Remove(groupid); + } + } + + public TradeGroup CreateTradeGroup(Player inviter, Player invitee) + { + lock (groupLock) + { + groupIndexId = groupIndexId | 0x0000000000000000; + + TradeGroup group = new TradeGroup(groupIndexId, inviter.actorId, invitee.actorId); + mTradeGroups.Add(groupIndexId, group); + groupIndexId++; + + group.SendGroupPacketsAll(inviter.actorId, invitee.actorId); + + inviter.SendGameMessage(GetActor(), 25101, 0x20, (object)invitee); //You request to trade with X + invitee.SendGameMessage(GetActor(), 25037, 0x20, (object)inviter); //X wishes to trade with you + + return group; + } + } + + public TradeGroup GetTradeGroup(uint actorId) + { + lock (groupLock) + { + foreach (TradeGroup group in mTradeGroups.Values) + { + if (group.GetHost() == actorId || group.GetOther() == actorId) + return (TradeGroup)group; + } + return null; + } + } + + public void DeleteTradeGroup(ulong groupid) + { + lock (groupLock) + { + if (mTradeGroups.ContainsKey(groupid)) + { + TradeGroup group = mTradeGroups[groupid]; + group.SendDeletePackets(group.GetHost(), group.GetOther()); + mTradeGroups.Remove(groupid); + } + } + } + + public void TradeTEST(Player player) + { + player.KickEventSpecial(Server.GetStaticActors("TradeExecuteCommand"), 0, "commandContent", null, null, null, 16, null, null, null, null, null); + } + + public void AcceptTrade(Player invitee) + { + TradeGroup group = GetTradeGroup(invitee.actorId); + + if (group == null) + { + invitee.SendMessage(0x20, "", "MASSIVE ERROR: No tradegroup found!!!"); + return; + } + + Player inviter = (Player)invitee.GetZone().FindActorInArea(group.GetHost()); + + //DeleteTradeGroup(group.groupIndex); + + inviter.StartTradeTransaction(invitee); + invitee.StartTradeTransaction(inviter); + + inviter.KickEventSpecial(Server.GetStaticActors("TradeExecuteCommand"), 0, "commandContent", null, null, null, 16, null, null, null, null, null); + invitee.KickEventSpecial(Server.GetStaticActors("TradeExecuteCommand"), 0, "commandContent", null, null, null, 16, null, null, null, null, null); + } + + public void CancelTradeTooFar(Player inviter) + { + TradeGroup group = GetTradeGroup(inviter.actorId); + + if (group == null) + { + inviter.SendMessage(0x20, "", "MASSIVE ERROR: No tradegroup found!!!"); + return; + } + + Player invitee = (Player)inviter.GetZone().FindActorInArea(group.GetOther()); + + inviter.SendGameMessage(GetActor(), 25042, 0x20); //You cancel the trade. + if (invitee != null) + invitee.SendGameMessage(GetActor(), 25042, 0x20); //The trade has been canceled. + + DeleteTradeGroup(group.groupIndex); + } + + public void CancelTrade(Player inviter) + { + TradeGroup group = GetTradeGroup(inviter.actorId); + + if (group == null) + { + inviter.SendMessage(0x20, "", "MASSIVE ERROR: No tradegroup found!!!"); + return; + } + + Player invitee = (Player)inviter.GetZone().FindActorInArea(group.GetOther()); + + inviter.SendGameMessage(GetActor(), 25041, 0x20); //You cancel the trade. + if (invitee != null) + invitee.SendGameMessage(GetActor(), 25040, 0x20); //The trade has been canceled. + + DeleteTradeGroup(group.groupIndex); + } + + public void RefuseTrade(Player invitee) + { + TradeGroup group = GetTradeGroup(invitee.actorId); + + if (group == null) + { + invitee.SendMessage(0x20, "", "MASSIVE ERROR: No tradegroup found!!!"); + return; + } + + Player inviter = (Player)invitee.GetZone().FindActorInArea(group.GetHost()); + + if (inviter != null) + inviter.SendGameMessage(GetActor(), 25038, 0x20); //Your trade request fails + + DeleteTradeGroup(group.groupIndex); + } + + public void SwapTradedItems(Player p1, Player p2) + { + lock (tradeLock) + { + if (p1.IsTradeAccepted() && p2.IsTradeAccepted()) + { + //move items around + + p1.FinishTradeTransaction(); + p2.FinishTradeTransaction(); + } + } + } + + public InventoryItem CreateItem(uint itemId, int amount, byte quality = 1, InventoryItem.ItemModifier modifiers = null) + { + return Database.CreateItem(itemId, amount, quality, modifiers); + } + + public bool BazaarBuyOperation(Player bazaar, Player buyer, InventoryItem itemToBuy, int quantity, int cost) + { + if (bazaar == null || buyer == null || itemToBuy == null) + return false; + + if (quantity <= 0) + return false; + + if (cost < 0) + return false; + + if (itemToBuy.GetBazaarMode() == InventoryItem.TYPE_SINGLE || itemToBuy.GetBazaarMode() == InventoryItem.TYPE_MULTI || itemToBuy.GetBazaarMode() == InventoryItem.TYPE_STACK) + { + itemToBuy.ChangeQuantity(-quantity); + buyer.AddItem(itemToBuy.itemId, quantity, itemToBuy.quality); + buyer.GetItemPackage(ItemPackage.CURRENCY_CRYSTALS).RemoveItem(1000001, cost); + } + + if (itemToBuy.quantity == 0) + Database.ClearBazaarEntry(bazaar, itemToBuy); + + bazaar.CheckBazaarFlags(); + + return true; + } + + public bool BazaarSellOperation(Player bazaar, Player buyer, InventoryItem reward, int rewardQuantity, InventoryItem seek, int seekQuantity) + { + if (bazaar == null || buyer == null || reward == null || seek == null) + return false; + + if (rewardQuantity <= 0 || seekQuantity <= 0) + return false; + + if (reward.GetBazaarMode() == InventoryItem.TYPE_SEEK_ITEM) + { + InventoryItem seekBazaar = bazaar.GetItemPackage(ItemPackage.BAZAAR).GetItemAttachedTo(reward); + bazaar.RemoveItem(reward, rewardQuantity); + bazaar.RemoveItem(seekBazaar, seekQuantity); + bazaar.AddItem(seekBazaar); + bazaar.AddItem(seek.itemId, seekQuantity, seek.quality); + + buyer.RemoveItem(seek, seekQuantity); + buyer.AddItem(reward); + } + + Database.ClearBazaarEntry(bazaar, reward); + + bazaar.CheckBazaarFlags(); + + return true; + } + + public void AddToBazaar(Player player, InventoryItem reward, InventoryItem seek, int rewardAmount, int seekAmount, byte bazaarMode) + { + bool succ = false; + + if (bazaarMode == InventoryItem.TYPE_SINGLE || bazaarMode == InventoryItem.TYPE_MULTI || bazaarMode == InventoryItem.TYPE_STACK) + succ = Database.CreateBazaarEntry(player, reward, seek, rewardAmount, 0, bazaarMode, seekAmount); + else + succ = Database.CreateBazaarEntry(player, reward, seek, rewardAmount, seekAmount, bazaarMode); + + if (succ) + { + if (bazaarMode != InventoryItem.TYPE_SINGLE && bazaarMode != InventoryItem.TYPE_MULTI && bazaarMode != InventoryItem.TYPE_STACK) + { + reward.SetDealingAttached(bazaarMode, seek.uniqueId); + seek.SetHasAttached(true); + player.GetItemPackage(ItemPackage.BAZAAR).StartSendUpdate(); + player.GetItemPackage(ItemPackage.BAZAAR).AddItem(reward); + player.GetItemPackage(ItemPackage.BAZAAR).AddItem(seek); + reward.SetAttachedIndex(ItemPackage.BAZAAR, seek.slot); + player.GetItemPackage(ItemPackage.BAZAAR).DoneSendUpdate(); + } + else + { + reward.SetDealing(bazaarMode, seekAmount); + player.GetItemPackage(ItemPackage.BAZAAR).StartSendUpdate(); + player.GetItemPackage(ItemPackage.BAZAAR).AddItem(reward); + player.GetItemPackage(ItemPackage.BAZAAR).DoneSendUpdate(); + } + + } + + player.CheckBazaarFlags(); + } + + + public void RemoveFromBazaar(Player player, InventoryItem rewardRef) + { + ushort attachedItemPackage = (ushort)((rewardRef.dealingAttached1 >> 16) & 0xFF); + ushort attachedSlot = (ushort) (rewardRef.dealingAttached1 & 0xFF); + + InventoryItem seekRef = rewardRef.IsSelling() ? null : player.GetItemPackage(attachedItemPackage).GetItemAtSlot(attachedSlot); + + Database.ClearBazaarEntry(player, rewardRef); + + player.GetItemPackage(ItemPackage.BAZAAR).RemoveItem(rewardRef); + + bool isSelling = rewardRef.IsSelling(); + rewardRef.SetNormal(); + + if (seekRef != null) + player.GetItemPackage(ItemPackage.BAZAAR).RemoveItem(seekRef); + + player.AddItem(rewardRef); + + if (!isSelling) + { + seekRef.SetNormal(); + player.AddItem(seekRef); + } + + player.CheckBazaarFlags(); + } + /* + public void TransactionBazaar(Player owner, Player other, InventoryItem reward, InventoryItem seek, int rewardAmount, int seekAmount) + { + Database.ClearBazaarEntry(owner, reward, seek); + + //Remove Bazaar Items from owner + owner.GetInventory(Inventory.BAZAAR).RemoveItem(reward); + owner.GetInventory(Inventory.BAZAAR).RemoveItem(seek); + + //Remove Seek item from other + if (seek.GetItemData().IsMoney()) + other.GetInventory(Inventory.CURRENCY_CRYSTALS).RemoveItem(seek.itemId, seekAmount); + else + other.GetInventory(Inventory.NORMAL).RemoveItem(seek.itemId, seekAmount); + + //Add reward to other, seek to owner + if (reward.GetItemData().IsMoney()) + other.GetInventory(Inventory.CURRENCY_CRYSTALS).AddItem(reward.itemId, rewardAmount); + else + other.GetInventory(Inventory.NORMAL).AddItem(reward); + + if (seek.GetItemData().IsMoney()) + owner.GetInventory(Inventory.CURRENCY_CRYSTALS).AddItem(seek.itemId, seekAmount); + else + other.GetInventory(Inventory.NORMAL).AddItem(seek); + }*/ + public bool SendGroupInit(Session session, ulong groupId) { if (mContentGroups.ContainsKey(groupId)) @@ -1192,6 +1513,11 @@ namespace FFXIVClassic_Map_Server mContentGroups[groupId].SendInitWorkValues(session); return true; } + else if (mTradeGroups.ContainsKey(groupId)) + { + mTradeGroups[groupId].SendInitWorkValues(session); + return true; + } return false; } diff --git a/FFXIVClassic Map Server/actors/area/Area.cs b/FFXIVClassic Map Server/actors/area/Area.cs index 1c16b1f5..69bdfda7 100644 --- a/FFXIVClassic Map Server/actors/area/Area.cs +++ b/FFXIVClassic Map Server/actors/area/Area.cs @@ -1,5 +1,4 @@ -using FFXIVClassic_Map_Server; -using FFXIVClassic.Common; +using FFXIVClassic.Common; using FFXIVClassic_Map_Server.actors.area; using FFXIVClassic_Map_Server.actors.chara.npc; using FFXIVClassic_Map_Server.lua; diff --git a/FFXIVClassic Map Server/actors/area/PrivateArea.cs b/FFXIVClassic Map Server/actors/area/PrivateArea.cs index 1fe98393..680999ac 100644 --- a/FFXIVClassic Map Server/actors/area/PrivateArea.cs +++ b/FFXIVClassic Map Server/actors/area/PrivateArea.cs @@ -3,11 +3,7 @@ using FFXIVClassic.Common; using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.lua; using FFXIVClassic_Map_Server.packets.send.actor; -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.actors.area { diff --git a/FFXIVClassic Map Server/actors/area/PrivateAreaContent.cs b/FFXIVClassic Map Server/actors/area/PrivateAreaContent.cs index d97b7efc..ba979387 100644 --- a/FFXIVClassic Map Server/actors/area/PrivateAreaContent.cs +++ b/FFXIVClassic Map Server/actors/area/PrivateAreaContent.cs @@ -1,16 +1,11 @@ using FFXIVClassic_Map_Server.actors.director; -using FFXIVClassic_Map_Server.actors.group; using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.lua; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.actors.area { - + class PrivateAreaContent : PrivateArea { private Director currentDirector; diff --git a/FFXIVClassic Map Server/actors/area/SpawnLocation.cs b/FFXIVClassic Map Server/actors/area/SpawnLocation.cs index 87c36f76..3321b4d2 100644 --- a/FFXIVClassic Map Server/actors/area/SpawnLocation.cs +++ b/FFXIVClassic Map Server/actors/area/SpawnLocation.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FFXIVClassic_Map_Server.actors.area +namespace FFXIVClassic_Map_Server.actors.area { class SpawnLocation { diff --git a/FFXIVClassic Map Server/actors/area/Zone.cs b/FFXIVClassic Map Server/actors/area/Zone.cs index d198fff5..652c84a2 100644 --- a/FFXIVClassic Map Server/actors/area/Zone.cs +++ b/FFXIVClassic Map Server/actors/area/Zone.cs @@ -1,7 +1,4 @@ -using FFXIVClassic_Map_Server; -using FFXIVClassic.Common; - -using FFXIVClassic_Map_Server.actors.chara.npc; +using FFXIVClassic.Common; using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.lua; using FFXIVClassic_Map_Server.packets.send.actor; @@ -11,7 +8,6 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; - using FFXIVClassic_Map_Server.actors.director; namespace FFXIVClassic_Map_Server.actors.area diff --git a/FFXIVClassic Map Server/actors/chara/Character.cs b/FFXIVClassic Map Server/actors/chara/Character.cs index 3aa4e0bc..22a35bbd 100644 --- a/FFXIVClassic Map Server/actors/chara/Character.cs +++ b/FFXIVClassic Map Server/actors/chara/Character.cs @@ -1,9 +1,12 @@  using FFXIVClassic.Common; using FFXIVClassic_Map_Server.actors.area; +using FFXIVClassic_Map_Server.actors.chara.player; using FFXIVClassic_Map_Server.actors.group; using FFXIVClassic_Map_Server.Actors.Chara; +using FFXIVClassic_Map_Server.dataobjects; using FFXIVClassic_Map_Server.packets.send.actor; +using FFXIVClassic_Map_Server.packets.send.actor.inventory; using FFXIVClassic_Map_Server.utils; using FFXIVClassic_Map_Server.actors.chara.ai; using System; @@ -107,7 +110,7 @@ namespace FFXIVClassic_Map_Server.Actors public Group currentParty = null; public ContentGroup currentContentGroup = null; - + //public DateTime lastAiUpdate; public AIContainer aiContainer; @@ -131,8 +134,13 @@ namespace FFXIVClassic_Map_Server.Actors public float extraFloat; protected Dictionary tempVars = new Dictionary(); + + //Inventory + protected Dictionary itemPackages = new Dictionary(); + protected Equipment equipment; - public Character(uint actorID) : base(actorID) + public Character(uint actorID) + : base(actorID) { //Init timer array to "notimer" for (int i = 0; i < charaWork.statusShownTime.Length; i++) @@ -207,7 +215,7 @@ namespace FFXIVClassic_Map_Server.Actors } return propPacketUtil.Done(); } - + public void PlayAnimation(uint animId, bool onlySelf = false) { if (onlySelf) @@ -218,7 +226,7 @@ namespace FFXIVClassic_Map_Server.Actors else zone.BroadcastPacketAroundActor(this, PlayAnimationOnActorPacket.BuildPacket(actorId, animId)); } - + public void DoBattleAction(ushort commandId, uint animationId) { zone.BroadcastPacketAroundActor(this, CommandResultX00Packet.BuildPacket(actorId, animationId, commandId)); @@ -493,7 +501,7 @@ namespace FFXIVClassic_Map_Server.Actors } return false; } - + public virtual void Cast(uint spellId, uint targetId = 0) { if (aiContainer.CanChangeState()) @@ -1133,5 +1141,180 @@ namespace FFXIVClassic_Map_Server.Actors targetFind.FindWithinArea(this, ValidTarget.PartyMember, TargetFindAOETarget.Self); return targetFind.GetTargets(); } + + #region Inventory + public void SendItemPackage(Player player, uint id) + { + if (!itemPackages.ContainsKey((ushort)id)) + return; + + player.QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId, true)); + itemPackages[(ushort)id].SendFullInventory(player); + player.QueuePacket(InventoryEndChangePacket.BuildPacket(actorId)); + } + + public void AddItem(uint catalogID) + { + AddItem(catalogID, 1); + } + + public void AddItem(uint catalogID, int quantity) + { + AddItem(catalogID, quantity, 1); + } + + public void AddItem(uint catalogID, int quantity, byte quality) + { + ushort itemPackage = GetPackageForItem(catalogID); + if (itemPackages.ContainsKey(itemPackage)) + { + itemPackages[itemPackage].AddItem(catalogID, quantity, quality); + } + } + + public void AddItem(InventoryItem item) + { + ushort itemPackage = GetPackageForItem(item.GetItemData().catalogID); + if (itemPackages.ContainsKey(itemPackage)) + { + itemPackages[itemPackage].AddItem(item); + } + } + + public void SetItem(InventoryItem item, ushort itemPackage, ushort slot) + { + if (itemPackages.ContainsKey(itemPackage)) + { + itemPackages[itemPackage].SetItem(slot, item); + } + } + + public void MoveItem(InventoryItem item, ushort destinationPackage) + { + ushort sourcePackage = item.itemPackage; + + if (!itemPackages.ContainsKey(sourcePackage) && !itemPackages.ContainsKey(destinationPackage)) + return; + + itemPackages[sourcePackage].RemoveItem(item); + itemPackages[destinationPackage].AddItem(item); + } + + public void RemoveItem(uint catalogID) + { + RemoveItem(catalogID, 1); + } + + public void RemoveItem(uint catalogID, int quantity) + { + RemoveItem(catalogID, quantity, 1); + } + + public void RemoveItem(uint catalogID, int quantity, byte quality) + { + ushort itemPackage = GetPackageForItem(catalogID); + if (itemPackages.ContainsKey(itemPackage)) + { + itemPackages[itemPackage].RemoveItem(catalogID, quantity, quality); + } + } + + public void RemoveItemAtSlot(ushort itemPackage, ushort slot) + { + if (itemPackages.ContainsKey(itemPackage)) + { + itemPackages[itemPackage].RemoveItemAtSlot(slot); + } + } + + public void RemoveItem(InventoryItem item) + { + RemoveItem(item, 1); + } + + public void RemoveItem(InventoryItem item, int quantity) + { + if (itemPackages.ContainsKey(item.itemPackage)) + { + itemPackages[item.itemPackage].RemoveItem(item, quantity); + } + } + + public bool HasItem(uint catalogID) + { + return HasItem(catalogID, 1); + } + + public bool HasItem(uint catalogID, int minQuantity) + { + return HasItem(catalogID, minQuantity, 1); + } + + public bool HasItem(uint catalogID, int minQuantity, byte quality) + { + ushort itemPackage = GetPackageForItem(catalogID); + if (itemPackages.ContainsKey(itemPackage)) + { + return itemPackages[itemPackage].HasItem(catalogID, minQuantity, quality); + } + return false; + } + + public bool HasItem(InventoryItem item) + { + ushort itemPackage = GetPackageForItem(item.GetItemData().catalogID); + if (itemPackages.ContainsKey(itemPackage)) + { + //return itemPackages[itemPackage].HasItem(item); + return false; //TODO FIX + } + else + return false; + } + + + public InventoryItem GetItem(LuaUtils.ItemRefParam reference) + { + if (reference.actorId != actorId) + return null; + if (itemPackages.ContainsKey(reference.itemPackage)) + { + return itemPackages[reference.itemPackage].GetItemAtSlot(reference.slot); + } + return null; + } + + public ItemPackage GetItemPackage(ushort package) + { + if (itemPackages.ContainsKey(package)) + return itemPackages[package]; + else + return null; + } + + public ushort GetPackageForItem(uint catalogID) + { + ItemData data = Server.GetItemGamedata(catalogID); + + if (data == null) + return ItemPackage.NORMAL; + else + { + if (data.IsMoney()) + return ItemPackage.CURRENCY_CRYSTALS; + else if (data.IsImportant()) + return ItemPackage.KEYITEMS; + else + return ItemPackage.NORMAL; + } + } + + //public void removeItem(byUniqueId) + //public void removeItem(byUniqueId, quantity) + //public void removeItem(slot) + //public void removeItem(slot, quantity) + + #endregion + } } \ No newline at end of file diff --git a/FFXIVClassic Map Server/actors/chara/npc/ActorClass.cs b/FFXIVClassic Map Server/actors/chara/npc/ActorClass.cs index 730f9cac..61e6d8eb 100644 --- a/FFXIVClassic Map Server/actors/chara/npc/ActorClass.cs +++ b/FFXIVClassic Map Server/actors/chara/npc/ActorClass.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FFXIVClassic_Map_Server.actors.chara.npc +namespace FFXIVClassic_Map_Server.actors.chara.npc { class ActorClass { diff --git a/FFXIVClassic Map Server/actors/chara/npc/Npc.cs b/FFXIVClassic Map Server/actors/chara/npc/Npc.cs index a351e73b..d38443d0 100644 --- a/FFXIVClassic Map Server/actors/chara/npc/Npc.cs +++ b/FFXIVClassic Map Server/actors/chara/npc/Npc.cs @@ -1,14 +1,10 @@ using FFXIVClassic.Common; using FFXIVClassic_Map_Server.actors; -using FFXIVClassic_Map_Server.actors.area; using FFXIVClassic_Map_Server.actors.chara.npc; using FFXIVClassic_Map_Server.Actors.Chara; -using FFXIVClassic_Map_Server.dataobjects; using FFXIVClassic_Map_Server.lua; -using FFXIVClassic_Map_Server.packets.receive.events; using FFXIVClassic_Map_Server.packets.send.actor; using FFXIVClassic_Map_Server.utils; -using MoonSharp.Interpreter; using MySql.Data.MySqlClient; using Newtonsoft.Json; using System; diff --git a/FFXIVClassic Map Server/actors/chara/npc/Retainer.cs b/FFXIVClassic Map Server/actors/chara/npc/Retainer.cs index ec82890e..2e6e2531 100644 --- a/FFXIVClassic Map Server/actors/chara/npc/Retainer.cs +++ b/FFXIVClassic Map Server/actors/chara/npc/Retainer.cs @@ -1,12 +1,6 @@ -using FFXIVClassic.Common; -using FFXIVClassic_Map_Server.actors.chara.player; +using FFXIVClassic_Map_Server.actors.chara.player; using FFXIVClassic_Map_Server.Actors; -using FFXIVClassic_Map_Server.packets.send.actor.inventory; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.actors.chara.npc { @@ -18,7 +12,6 @@ namespace FFXIVClassic_Map_Server.actors.chara.npc private uint retainerId; private Player ownerPlayer; - private Dictionary inventories = new Dictionary(); public Retainer(uint retainerId, ActorClass actorClass, Player player, float posX, float posY, float posZ, float rot) : base(0, actorClass, "myretainer", player.GetZone(), posX, posY, posZ, rot, 0, 0, null) @@ -27,33 +20,16 @@ namespace FFXIVClassic_Map_Server.actors.chara.npc this.ownerPlayer = player; this.actorName = String.Format("_rtnre{0:x7}", actorId); - inventories[Inventory.NORMAL] = new Inventory(this, MAXSIZE_INVENTORY_NORMAL, Inventory.NORMAL); - inventories[Inventory.CURRENCY_CRYSTALS] = new Inventory(this, MAXSIZE_INVENTORY_CURRANCY, Inventory.CURRENCY_CRYSTALS); - inventories[Inventory.BAZAAR] = new Inventory(this, MAXSIZE_INVENTORY_BAZAAR, Inventory.BAZAAR); + itemPackages[ItemPackage.NORMAL] = new ItemPackage(this, MAXSIZE_INVENTORY_NORMAL, ItemPackage.NORMAL); + itemPackages[ItemPackage.CURRENCY_CRYSTALS] = new ItemPackage(this, MAXSIZE_INVENTORY_CURRANCY, ItemPackage.CURRENCY_CRYSTALS); + itemPackages[ItemPackage.BAZAAR] = new ItemPackage(this, MAXSIZE_INVENTORY_BAZAAR, ItemPackage.BAZAAR); - inventories[Inventory.NORMAL].InitList(Database.GetInventory(this, Inventory.NORMAL)); - inventories[Inventory.CURRENCY_CRYSTALS].InitList(Database.GetInventory(this, Inventory.CURRENCY_CRYSTALS)); - inventories[Inventory.BAZAAR].InitList(Database.GetInventory(this, Inventory.BAZAAR)); + itemPackages[ItemPackage.NORMAL].InitList(Database.GetInventory(this, ItemPackage.NORMAL)); + itemPackages[ItemPackage.CURRENCY_CRYSTALS].InitList(Database.GetInventory(this, ItemPackage.CURRENCY_CRYSTALS)); + itemPackages[ItemPackage.BAZAAR].InitList(Database.GetInventory(this, ItemPackage.BAZAAR)); } - public Inventory GetInventory(ushort type) - { - if (inventories.ContainsKey(type)) - return inventories[type]; - else - return null; - } - - public void SendFullRetainerInventory(Player player) - { - player.QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId)); - inventories[Inventory.NORMAL].SendFullInventory(player); - inventories[Inventory.CURRENCY_CRYSTALS].SendFullInventory(player); - inventories[Inventory.BAZAAR].SendFullInventory(player); - player.QueuePacket(InventoryEndChangePacket.BuildPacket(actorId)); - } - - public uint getRetainerId() + public uint GetRetainerId() { return retainerId; } diff --git a/FFXIVClassic Map Server/actors/chara/player/Equipment.cs b/FFXIVClassic Map Server/actors/chara/player/Equipment.cs index 87ad1210..f25e3314 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Equipment.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Equipment.cs @@ -30,11 +30,11 @@ namespace FFXIVClassic_Map_Server.actors.chara.player private ushort inventoryCapacity; private ushort inventoryCode; private InventoryItem[] list; - private Inventory normalInventory; + private ItemPackage normalInventory; private bool writeToDB = true; - public Equipment(Player ownerPlayer, Inventory normalInventory, ushort capacity, ushort code) + public Equipment(Player ownerPlayer, ItemPackage normalInventory, ushort capacity, ushort code) { owner = ownerPlayer; inventoryCapacity = capacity; @@ -63,7 +63,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player } } - toPlayer.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, 0x23, Inventory.EQUIPMENT_OTHERPLAYER)); + toPlayer.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, 0x23, ItemPackage.EQUIPMENT_OTHERPLAYER)); int currentIndex = 0; while (true) diff --git a/FFXIVClassic Map Server/actors/chara/player/Inventory.cs b/FFXIVClassic Map Server/actors/chara/player/Inventory.cs index a0d741d9..4bdcfaa8 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Inventory.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Inventory.cs @@ -10,16 +10,17 @@ using System.Linq; namespace FFXIVClassic_Map_Server.actors.chara.player { - class Inventory + class ItemPackage { public const ushort NORMAL = 0; //Max 0xC8 - public const ushort TRADE = 1; //Max 0x96 + public const ushort UNKNOWN = 1; //Max 0x96 public const ushort LOOT = 4; //Max 0xA public const ushort MELDREQUEST = 5; //Max 0x04 public const ushort BAZAAR = 7; //Max 0x0A public const ushort CURRENCY_CRYSTALS = 99; //Max 0x140 public const ushort KEYITEMS = 100; //Max 0x500 public const ushort EQUIPMENT = 0x00FE; //Max 0x23 + public const ushort TRADE = 0x00FD; //Max 0x04 public const ushort EQUIPMENT_OTHERPLAYER = 0x00F9; //Max 0x23 public enum INV_ERROR { @@ -30,19 +31,20 @@ namespace FFXIVClassic_Map_Server.actors.chara.player }; private Character owner; - private ushort inventoryCapacity; - private ushort inventoryCode; + private ushort itemPackageCapacity; + private ushort itemPackageCode; private bool isTemporary; private InventoryItem[] list; private bool[] isDirty; + private bool holdingUpdates = false; private int endOfListIndex = 0; - - public Inventory(Character ownerPlayer, ushort capacity, ushort code, bool temporary = false) + + public ItemPackage(Character ownerPlayer, ushort capacity, ushort code, bool temporary = false) { owner = ownerPlayer; - inventoryCapacity = capacity; - inventoryCode = code; + itemPackageCapacity = capacity; + itemPackageCode = code; isTemporary = temporary; list = new InventoryItem[capacity]; isDirty = new bool[capacity]; @@ -53,7 +55,10 @@ namespace FFXIVClassic_Map_Server.actors.chara.player { int i = 0; foreach (InventoryItem item in itemsFromDB) + { + item.RefreshPositioning(owner, itemPackageCode, (ushort) i); list[i++] = item; + } endOfListIndex = i; } @@ -92,63 +97,80 @@ namespace FFXIVClassic_Map_Server.actors.chara.player } return null; } - - - public int GetItemQuantity(uint itemId) + + public InventoryItem GetItemAttachedTo(InventoryItem attachedTo) { - return GetItemQuantity(itemId, 1); - } - - public int GetItemQuantity(uint itemId, uint quality) - { - int count = 0; - - for (int i = endOfListIndex - 1; i >= 0; i--) + for (int i = 0; i < endOfListIndex; i++) { InventoryItem item = list[i]; - if (item.itemId == itemId && item.quality == quality) - count += item.quantity; + Debug.Assert(item != null, "Item slot was null!!!"); + if (attachedTo.GetAttached() == item.uniqueId) + return item; } - - return count; + return null; } - - public int AddItem(uint itemId) + public INV_ERROR AddItem(uint itemId) { return AddItem(itemId, 1, 1); } - public void AddItem(uint[] itemId) - { - for (int i = 0; i < itemId.Length; i++) - AddItem(itemId[i]); - } - - public int AddItem(uint itemId, int quantity) + public INV_ERROR AddItem(uint itemId, int quantity) { return AddItem(itemId, quantity, 1); } - - public int AddItem(uint itemId, int quantity, byte quality) + + public INV_ERROR AddItem(InventoryItem itemRef) { + //If it isn't a single item (ie: armor) just add like normal (not valid for BAZAAR) + if (itemPackageCode != BAZAAR && itemRef.GetItemData().maxStack > 1) + return AddItem(itemRef.itemId, itemRef.quantity, itemRef.quality); + + if (!IsSpaceForAdd(itemRef.itemId, itemRef.quantity, itemRef.quality)) + return INV_ERROR.INVENTORY_FULL; + + ItemData gItem = Server.GetItemGamedata(itemRef.itemId); + + if (gItem == null) + { + Program.Log.Error("Inventory.AddItem: unable to find item %u", itemRef.itemId); + return INV_ERROR.SYSTEM_ERROR; + } + + itemRef.RefreshPositioning(owner, itemPackageCode, (ushort)endOfListIndex); + + isDirty[endOfListIndex] = true; + list[endOfListIndex++] = itemRef; + DoDatabaseAdd(itemRef); + + SendUpdatePackets(); + + return INV_ERROR.SUCCESS; + } + + public INV_ERROR AddItem(uint itemId, int quantity, byte quality) + { if (!IsSpaceForAdd(itemId, quantity, quality)) - return (int)INV_ERROR.INVENTORY_FULL; + return INV_ERROR.INVENTORY_FULL; ItemData gItem = Server.GetItemGamedata(itemId); + //If it's unique, abort + if (HasItem(itemId) && gItem.isExclusive) + return INV_ERROR.ALREADY_HAS_UNIQUE; + if (gItem == null) { Program.Log.Error("Inventory.AddItem: unable to find item %u", itemId); - return (int)INV_ERROR.SYSTEM_ERROR; + return INV_ERROR.SYSTEM_ERROR; } //Check if item id exists int quantityCount = quantity; for (int i = 0; i < endOfListIndex; i++) - { + { InventoryItem item = list[i]; Debug.Assert(item != null, "Item slot was null!!!"); @@ -161,23 +183,26 @@ namespace FFXIVClassic_Map_Server.actors.chara.player quantityCount -= (gItem.maxStack - oldQuantity); DoDatabaseQuantity(item.uniqueId, item.quantity); - + if (quantityCount <= 0) break; } } - - //If it's unique, abort - if (HasItem(itemId) && gItem.isRare) - return (int)INV_ERROR.ALREADY_HAS_UNIQUE; //New item that spilled over while (quantityCount > 0) { - InventoryItem addedItem = Database.CreateItem(itemId, Math.Min(quantityCount, gItem.maxStack), quality, gItem.isExclusive ? (byte)0x3 : (byte)0x0, gItem.durability); - addedItem.slot = (ushort)endOfListIndex; + InventoryItem.ItemModifier modifiers = null; + if (gItem.durability != 0) + { + modifiers = new InventoryItem.ItemModifier(); + modifiers.durability = (uint)gItem.durability; + } + + InventoryItem addedItem = Database.CreateItem(itemId, Math.Min(quantityCount, gItem.maxStack), quality, modifiers); + addedItem.RefreshPositioning(owner, itemPackageCode, (ushort)endOfListIndex); isDirty[endOfListIndex] = true; - list[endOfListIndex++] = addedItem; + list[endOfListIndex++] = addedItem; quantityCount -= gItem.maxStack; DoDatabaseAdd(addedItem); @@ -185,7 +210,14 @@ namespace FFXIVClassic_Map_Server.actors.chara.player SendUpdatePackets(); - return (int)INV_ERROR.SUCCESS; + return INV_ERROR.SUCCESS; + } + + public void SetItem(ushort slot, InventoryItem item) + { + list[slot] = item; + SendUpdatePackets(); + item.RefreshPositioning(owner, itemPackageCode, slot); } public void RemoveItem(uint itemId) @@ -223,15 +255,14 @@ namespace FFXIVClassic_Map_Server.actors.chara.player //Stack nomnomed if (item.quantity - quantityCount <= 0) { - DoDatabaseRemove(list[i].uniqueId); + DoDatabaseRemove(list[i].uniqueId); list[i] = null; } //Stack reduced else { item.quantity -= quantityCount; - DoDatabaseQuantity(list[i].uniqueId, list[i].quantity); - } + DoDatabaseQuantity(list[i].uniqueId, list[i].quantity);} isDirty[i] = true; @@ -244,14 +275,24 @@ namespace FFXIVClassic_Map_Server.actors.chara.player } DoRealign(); - SendUpdatePackets(); + SendUpdatePackets(); } - public void RemoveItemByUniqueId(ulong itemDBId) + public void RemoveItem(InventoryItem item) + { + RemoveItemByUniqueId(item.uniqueId, item.quantity); + } + + public void RemoveItem(InventoryItem item, int quantity) + { + RemoveItemByUniqueId(item.uniqueId, quantity); + } + + public void RemoveItemByUniqueId(ulong itemDBId, int quantity) { ushort slot = 0; InventoryItem toDelete = null; - for (int i = endOfListIndex - 1; i >= 0; i--) + for (int i = 0; i < endOfListIndex; i++) { InventoryItem item = list[i]; @@ -267,10 +308,19 @@ namespace FFXIVClassic_Map_Server.actors.chara.player if (toDelete == null) return; - - DoDatabaseRemove(toDelete.uniqueId); - list[slot] = null; + if (quantity >= toDelete.quantity) + { + DoDatabaseRemove(toDelete.uniqueId); + list[slot].RefreshPositioning(null, 0xFFFF, 0xFFFF); + list[slot] = null; + } + else + { + list[slot].quantity -= quantity; + DoDatabaseQuantity(list[slot].uniqueId, list[slot].quantity); + } + isDirty[slot] = true; DoRealign(); @@ -284,9 +334,10 @@ namespace FFXIVClassic_Map_Server.actors.chara.player DoDatabaseRemove(list[slot].uniqueId); + list[slot].RefreshPositioning(null, 0xFFFF, 0xFFFF); list[slot] = null; isDirty[slot] = true; - + DoRealign(); SendUpdatePackets(); } @@ -304,15 +355,34 @@ namespace FFXIVClassic_Map_Server.actors.chara.player { DoDatabaseRemove(list[slot].uniqueId); + list[slot].RefreshPositioning(null, 0xFFFF, 0xFFFF); list[slot] = null; DoRealign(); } - else - DoDatabaseQuantity(list[slot].uniqueId, list[slot].quantity); + else + DoDatabaseQuantity(list[slot].uniqueId, list[slot].quantity); isDirty[slot] = true; SendUpdatePackets(); - } + } + } + + public void Clear() + { + for (int i = 0; i < endOfListIndex; i++) + { + list[i].RefreshPositioning(null, 0xFFFF, 0xFFFF); + list[i] = null; + isDirty[i] = true; + } + endOfListIndex = 0; + + SendUpdatePackets(); + } + + public InventoryItem[] GetRawList() + { + return list; } public void ChangeDurability(uint slot, uint durabilityChange) @@ -334,14 +404,14 @@ namespace FFXIVClassic_Map_Server.actors.chara.player #region Packet Functions public void SendFullInventory(Player player) { - player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, inventoryCapacity, inventoryCode)); + player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, itemPackageCapacity, itemPackageCode)); SendInventoryPackets(player, 0); - player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId)); + player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId)); } private void SendInventoryPackets(Player player, InventoryItem item) { - player.QueuePacket(InventoryListX01Packet.BuildPacket(owner.actorId, item)); + player.QueuePacket(InventoryListX01Packet.BuildPacket(owner.actorId, item)); } private void SendInventoryPackets(Player player, List items) @@ -366,7 +436,6 @@ namespace FFXIVClassic_Map_Server.actors.chara.player else break; } - } private void SendInventoryPackets(Player player, int startOffset) @@ -395,7 +464,6 @@ namespace FFXIVClassic_Map_Server.actors.chara.player else break; } - } private void SendInventoryRemovePackets(Player player, ushort index) @@ -425,26 +493,25 @@ namespace FFXIVClassic_Map_Server.actors.chara.player else break; } - } public void RefreshItem(Player player, InventoryItem item) { - player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, inventoryCapacity, inventoryCode)); + player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, itemPackageCapacity, itemPackageCode)); SendInventoryPackets(player, item); - player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId)); + player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId)); } public void RefreshItem(Player player, params InventoryItem[] items) { - player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, inventoryCapacity, inventoryCode)); + player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, itemPackageCapacity, itemPackageCode)); SendInventoryPackets(player, items.ToList()); - player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId)); + player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId)); } public void RefreshItem(Player player, List items) { - player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, inventoryCapacity, inventoryCode)); + player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, itemPackageCapacity, itemPackageCode)); SendInventoryPackets(player, items); player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId)); } @@ -458,10 +525,13 @@ namespace FFXIVClassic_Map_Server.actors.chara.player if (isTemporary) return; + if (itemPackageCode == BAZAAR) + return; + if (owner is Player) - Database.AddItem((Player)owner, addedItem, inventoryCode); + Database.AddItem((Player)owner, addedItem, itemPackageCode); else if (owner is Retainer) - Database.AddItem((Retainer)owner, addedItem, inventoryCode); + Database.AddItem((Retainer)owner, addedItem, itemPackageCode); } private void DoDatabaseQuantity(ulong itemDBId, int quantity) @@ -469,10 +539,11 @@ namespace FFXIVClassic_Map_Server.actors.chara.player if (isTemporary) return; - if (owner is Player) - Database.SetQuantity((Player)owner, itemDBId, inventoryCode); - else if (owner is Retainer) - Database.SetQuantity((Retainer)owner, itemDBId, inventoryCode); + + if (itemPackageCode == BAZAAR) + return; + + Database.SetQuantity(itemDBId, quantity); } private void DoDatabaseRemove(ulong itemDBId) @@ -480,6 +551,9 @@ namespace FFXIVClassic_Map_Server.actors.chara.player if (isTemporary) return; + if (itemPackageCode == BAZAAR) + return; + if (owner is Player) Database.RemoveItem((Player)owner, itemDBId); else if (owner is Retainer) @@ -488,13 +562,13 @@ namespace FFXIVClassic_Map_Server.actors.chara.player private void SendUpdatePackets() { - if (owner is Player) + if (owner is Player && !holdingUpdates) { - SendUpdatePackets((Player)owner, true); + SendUpdatePackets((Player)owner); } } - public void SendUpdatePackets(Player player, bool doneImmediate = false) + public void SendUpdatePackets(Player player) { List items = new List(); List slotsToRemove = new List(); @@ -513,21 +587,28 @@ namespace FFXIVClassic_Map_Server.actors.chara.player slotsToRemove.Add((ushort)i); } - if (doneImmediate) - DoneSendUpdate(); + if (!holdingUpdates) + Array.Clear(isDirty, 0, isDirty.Length); player.QueuePacket(InventoryBeginChangePacket.BuildPacket(owner.actorId)); - player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, inventoryCapacity, inventoryCode)); + player.QueuePacket(InventorySetBeginPacket.BuildPacket(owner.actorId, itemPackageCapacity, itemPackageCode)); //Send Updated Slots SendInventoryPackets(player, items); //Send Remove packets for tail end SendInventoryRemovePackets(player, slotsToRemove); player.QueuePacket(InventorySetEndPacket.BuildPacket(owner.actorId)); - player.QueuePacket(InventoryEndChangePacket.BuildPacket(owner.actorId)); + player.QueuePacket(InventoryEndChangePacket.BuildPacket(owner.actorId)); + } + + public void StartSendUpdate() + { + holdingUpdates = true; } public void DoneSendUpdate() { + holdingUpdates = false; + SendUpdatePackets(); Array.Clear(isDirty, 0, isDirty.Length); } @@ -537,7 +618,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player public bool IsFull() { - return endOfListIndex >= inventoryCapacity; + return endOfListIndex >= itemPackageCapacity; } public bool IsSpaceForAdd(uint itemId, int quantity, int quality) @@ -554,7 +635,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player break; } } - + return quantityCount <= 0 || (quantityCount > 0 && !IsFull()); } @@ -584,7 +665,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player if (count >= minQuantity) return true; } - + return false; } @@ -620,6 +701,10 @@ namespace FFXIVClassic_Map_Server.actors.chara.player } #endregion - + + public int GetCount() + { + return endOfListIndex; + } } } diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index 8701ca01..c37bb28a 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -23,6 +23,9 @@ using FFXIVClassic_Map_Server.packets.send.actor.inventory; using FFXIVClassic_Map_Server.packets.send.player; using FFXIVClassic_Map_Server.packets.send.actor.battle; using FFXIVClassic_Map_Server.packets.receive.events; +using FFXIVClassic_Map_Server.actors.group; +using FFXIVClassic_Map_Server.packets.WorldPackets.Send.Group; +using FFXIVClassic_Map_Server.actors.chara.npc; namespace FFXIVClassic_Map_Server.Actors { @@ -71,7 +74,6 @@ namespace FFXIVClassic_Map_Server.Actors //Event Related public uint currentEventOwner = 0; public string currentEventName = ""; - public Coroutine currentEventRunning; //Player Info @@ -84,9 +86,11 @@ namespace FFXIVClassic_Map_Server.Actors public bool isGM = false; public bool isZoneChanging = true; - //Inventory - private Dictionary inventories = new Dictionary(); - private Equipment equipment; + //Trading + private Player otherTrader = null; + private ItemPackage myOfferings; + private bool isTradeAccepted = false; + private bool isTradeLocked = false; //GC Related public byte gcCurrent; @@ -115,6 +119,10 @@ namespace FFXIVClassic_Map_Server.Actors public uint homepoint = 0; public byte homepointInn = 0; + //Nameplate Stuff + public uint currentLSPlate = 0; + public byte repairType = 0; + //Retainer RetainerMeetingRelationGroup retainerMeetingGroup = null; public Retainer currentSpawnedRetainer = null; @@ -138,14 +146,14 @@ namespace FFXIVClassic_Map_Server.Actors moveSpeeds[2] = SetActorSpeedPacket.DEFAULT_RUN; moveSpeeds[3] = SetActorSpeedPacket.DEFAULT_ACTIVE; - inventories[Inventory.NORMAL] = new Inventory(this, MAXSIZE_INVENTORY_NORMAL, Inventory.NORMAL); - inventories[Inventory.KEYITEMS] = new Inventory(this, MAXSIZE_INVENTORY_KEYITEMS, Inventory.KEYITEMS); - inventories[Inventory.CURRENCY_CRYSTALS] = new Inventory(this, MAXSIZE_INVENTORY_CURRANCY, Inventory.CURRENCY_CRYSTALS); - inventories[Inventory.MELDREQUEST] = new Inventory(this, MAXSIZE_INVENTORY_MELDREQUEST, Inventory.MELDREQUEST); - inventories[Inventory.BAZAAR] = new Inventory(this, MAXSIZE_INVENTORY_BAZAAR, Inventory.BAZAAR); - inventories[Inventory.LOOT] = new Inventory(this, MAXSIZE_INVENTORY_LOOT, Inventory.LOOT); + itemPackages[ItemPackage.NORMAL] = new ItemPackage(this, MAXSIZE_INVENTORY_NORMAL, ItemPackage.NORMAL); + itemPackages[ItemPackage.KEYITEMS] = new ItemPackage(this, MAXSIZE_INVENTORY_KEYITEMS, ItemPackage.KEYITEMS); + itemPackages[ItemPackage.CURRENCY_CRYSTALS] = new ItemPackage(this, MAXSIZE_INVENTORY_CURRANCY, ItemPackage.CURRENCY_CRYSTALS); + itemPackages[ItemPackage.MELDREQUEST] = new ItemPackage(this, MAXSIZE_INVENTORY_MELDREQUEST, ItemPackage.MELDREQUEST); + itemPackages[ItemPackage.BAZAAR] = new ItemPackage(this, MAXSIZE_INVENTORY_BAZAAR, ItemPackage.BAZAAR); + itemPackages[ItemPackage.LOOT] = new ItemPackage(this, MAXSIZE_INVENTORY_LOOT, ItemPackage.LOOT); - equipment = new Equipment(this, inventories[Inventory.NORMAL], MAXSIZE_INVENTORY_EQUIPMENT, Inventory.EQUIPMENT); + equipment = new Equipment(this, itemPackages[ItemPackage.NORMAL], MAXSIZE_INVENTORY_EQUIPMENT, ItemPackage.EQUIPMENT); //Set the Skill level caps of all FFXIV (classes)skills to 50 for (int i = 0; i < charaWork.battleSave.skillLevelCap.Length; i++) @@ -228,7 +236,7 @@ namespace FFXIVClassic_Map_Server.Actors Database.LoadPlayerCharacter(this); lastPlayTimeUpdate = Utils.UnixTimeStampUTC(); - + this.aiContainer = new AIContainer(this, new PlayerController(this), null, new TargetFind(this)); allegiance = CharacterTargetingAllegiance.Player; CalculateBaseStats(); @@ -474,7 +482,18 @@ namespace FFXIVClassic_Map_Server.Actors propPacketUtil.AddProperty(String.Format("work.guildleveChecked[{0}]", i)); } - //NPC Linkshell + //Bazaar + CheckBazaarFlags(true); + if (charaWork.eventSave.repairType != 0) + propPacketUtil.AddProperty("charaWork.eventSave.repairType"); + if (charaWork.eventTemp.bazaarRetail) + propPacketUtil.AddProperty("charaWork.eventTemp.bazaarRetail"); + if (charaWork.eventTemp.bazaarRepair) + propPacketUtil.AddProperty("charaWork.eventTemp.bazaarRepair"); + if (charaWork.eventTemp.bazaarMateria) + propPacketUtil.AddProperty("charaWork.eventTemp.bazaarMateria"); + + //NPC Linkshell for (int i = 0; i < playerWork.npcLinkshellChatCalling.Length; i++) { if (playerWork.npcLinkshellChatCalling[i] != false) @@ -514,13 +533,13 @@ namespace FFXIVClassic_Map_Server.Actors //GetSpawnPackets(actorId, spawnType).DebugPrintPacket(); #region Inventory & Equipment - QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId)); - inventories[Inventory.NORMAL].SendFullInventory(this); - inventories[Inventory.CURRENCY_CRYSTALS].SendFullInventory(this); - inventories[Inventory.KEYITEMS].SendFullInventory(this); - inventories[Inventory.BAZAAR].SendFullInventory(this); - inventories[Inventory.MELDREQUEST].SendFullInventory(this); - inventories[Inventory.LOOT].SendFullInventory(this); + QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId, true)); + itemPackages[ItemPackage.NORMAL].SendFullInventory(this); + itemPackages[ItemPackage.CURRENCY_CRYSTALS].SendFullInventory(this); + itemPackages[ItemPackage.KEYITEMS].SendFullInventory(this); + itemPackages[ItemPackage.BAZAAR].SendFullInventory(this); + itemPackages[ItemPackage.MELDREQUEST].SendFullInventory(this); + itemPackages[ItemPackage.LOOT].SendFullInventory(this); equipment.SendFullEquipment(false); playerSession.QueuePacket(InventoryEndChangePacket.BuildPacket(actorId)); #endregion @@ -623,6 +642,33 @@ namespace FFXIVClassic_Map_Server.Actors } } + public void BroadcastPackets(List packets, bool sendToSelf) + { + foreach (SubPacket packet in packets) + { + if (sendToSelf) + { + + SubPacket clonedPacket = new SubPacket(packet, actorId); + QueuePacket(clonedPacket); + } + + foreach (Actor a in playerSession.actorInstanceList) + { + if (a is Player) + { + Player p = (Player)a; + + if (p.Equals(this)) + continue; + + SubPacket clonedPacket = new SubPacket(packet, a.actorId); + p.QueuePacket(clonedPacket); + } + } + } + } + public void BroadcastPacket(SubPacket packet, bool sendToSelf) { if (sendToSelf) @@ -937,6 +983,8 @@ namespace FFXIVClassic_Map_Server.Actors public void PrepareClassChange(byte classId) { //If new class, init abilties and level + if (charaWork.battleSave.skillLevel[classId - 1] <= 0) + UpdateClassLevel(classId, 1); SendCharaExpInfo(); } @@ -1003,6 +1051,16 @@ namespace FFXIVClassic_Map_Server.Actors RecalculateStats(); } + public void UpdateClassLevel(byte classId, short level) + { + Database.PlayerCharacterUpdateClassLevel(this, classId, level); + charaWork.battleSave.skillLevel[classId - 1] = level; + ActorPropertyPacketUtil propertyBuilder = new ActorPropertyPacketUtil("charaWork/exp", this); + propertyBuilder.AddProperty(String.Format("charaWork.battleSave.skillLevel[{0}]", classId-1)); + List packets = propertyBuilder.Done(); + QueuePackets(packets); + } + public void GraphicChange(int slot, InventoryItem invItem) { if (invItem == null) @@ -1048,18 +1106,68 @@ namespace FFXIVClassic_Map_Server.Actors BroadcastPacket(CreateAppearancePacket(), true); } - public Inventory GetInventory(ushort type) + public void SetRepairRequest(byte type) { - if (inventories.ContainsKey(type)) - return inventories[type]; - else - return null; + charaWork.eventSave.repairType = type; + ActorPropertyPacketUtil propPacketUtil = new ActorPropertyPacketUtil("charaWork/bazaar", this); + propPacketUtil.AddProperty("charaWork.eventSave.repairType"); + QueuePackets(propPacketUtil.Done()); } + public void CheckBazaarFlags(bool noUpdate = false) + { + bool isDealing = false, isRepairing = false, seekingItem = false; + lock (GetItemPackage(ItemPackage.BAZAAR)) + { + foreach (InventoryItem item in GetItemPackage(ItemPackage.BAZAAR).GetRawList()) + { + if (item == null) + break; + + if (item.GetBazaarMode() == InventoryItem.TYPE_SINGLE || item.GetBazaarMode() == InventoryItem.TYPE_MULTI || item.GetBazaarMode() == InventoryItem.TYPE_STACK) + isDealing = true; + if (item.GetBazaarMode() == InventoryItem.TYPE_SEEK_REPAIR) + isRepairing = true; + if (item.GetBazaarMode() == InventoryItem.TYPE_SEEK_ITEM) + isDealing = true; + + if (isDealing && isRepairing && seekingItem) + break; + } + } + + bool doUpdate = false; + + ActorPropertyPacketUtil propPacketUtil = new ActorPropertyPacketUtil("charaWork/bazaar", this); + if (charaWork.eventTemp.bazaarRetail != isDealing) + { + charaWork.eventTemp.bazaarRetail = isDealing; + propPacketUtil.AddProperty("charaWork.eventTemp.bazaarRetail"); + doUpdate = true; + } + + if (charaWork.eventTemp.bazaarRepair != isRepairing) + { + charaWork.eventTemp.bazaarRepair = isRepairing; + propPacketUtil.AddProperty("charaWork.eventTemp.bazaarRepair"); + doUpdate = true; + } + + if (charaWork.eventTemp.bazaarMateria != (GetItemPackage(ItemPackage.MELDREQUEST).GetCount() != 0)) + { + charaWork.eventTemp.bazaarMateria = GetItemPackage(ItemPackage.MELDREQUEST).GetCount() != 0; + propPacketUtil.AddProperty("charaWork.eventTemp.bazaarMateria"); + doUpdate = true; + } + + if (!noUpdate && doUpdate) + BroadcastPackets(propPacketUtil.Done(), true); + } + public int GetCurrentGil() { - if (GetInventory(Inventory.CURRENCY_CRYSTALS).HasItem(1000001)) - return GetInventory(Inventory.CURRENCY_CRYSTALS).GetItemByCatelogId(1000001).quantity; + if (HasItem(1000001)) + return GetItemPackage(ItemPackage.CURRENCY_CRYSTALS).GetItemByCatelogId(1000001).quantity; else return 0; } @@ -1576,8 +1684,10 @@ namespace FFXIVClassic_Map_Server.Actors public void SendMyTradeToPlayer(Player player) { - Inventory tradeInventory = new Inventory(this, 4, Inventory.TRADE); + ItemPackage tradeInventory = new ItemPackage(this, 4, ItemPackage.TRADE); + player.QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId, true)); tradeInventory.SendFullInventory(player); + player.QueuePacket(InventoryEndChangePacket.BuildPacket(actorId)); } public void SendDataPacket(params object[] parameters) @@ -1590,13 +1700,15 @@ namespace FFXIVClassic_Map_Server.Actors public void StartEvent(Actor owner, EventStartPacket start) { + currentEventOwner = start.scriptOwnerActorID; + currentEventName = start.triggerName; LuaEngine.GetInstance().EventStarted(this, owner, start); } public void UpdateEvent(EventUpdatePacket update) { - LuaEngine.GetInstance().OnEventUpdate(this, update.luaParams); - } + LuaEngine.GetInstance().OnEventUpdate(this, update.luaParams); + } public void KickEvent(Actor actor, string conditionName, params object[] parameters) { @@ -1604,7 +1716,18 @@ namespace FFXIVClassic_Map_Server.Actors return; List lParams = LuaUtils.CreateLuaParamList(parameters); - SubPacket spacket = KickEventPacket.BuildPacket(actorId, actor.actorId, conditionName, lParams); + SubPacket spacket = KickEventPacket.BuildPacket(actorId, actor.actorId, 0x75dc1705, conditionName, lParams); + spacket.DebugPrintSubPacket(); + QueuePacket(spacket); + } + + public void KickEventSpecial(Actor actor, uint unknown, string conditionName, params object[] parameters) + { + if (actor == null) + return; + + List lParams = LuaUtils.CreateLuaParamList(parameters); + SubPacket spacket = KickEventPacket.BuildPacket(actorId, actor.actorId, unknown, conditionName, lParams); spacket.DebugPrintSubPacket(); QueuePacket(spacket); } @@ -1612,7 +1735,7 @@ namespace FFXIVClassic_Map_Server.Actors public void SetEventStatus(Actor actor, string conditionName, bool enabled, byte unknown) { QueuePacket(packets.send.actor.events.SetEventStatus.BuildPacket(actor.actorId, enabled, unknown, conditionName)); - } + } public void RunEventFunction(string functionName, params object[] parameters) { @@ -2572,5 +2695,127 @@ namespace FFXIVClassic_Map_Server.Actors return equippedItem != null && equippedItem.itemId == itemId; } + public Retainer GetSpawnedRetainer() + { + return currentSpawnedRetainer; + } + + public void StartTradeTransaction(Player otherPlayer) + { + myOfferings = new ItemPackage(this, 4, ItemPackage.TRADE, true); + ItemPackage otherPlayerOfferings = new ItemPackage(otherPlayer, 4, ItemPackage.TRADE, true); + + myOfferings.StartSendUpdate(); + myOfferings.SendUpdatePackets(this); + myOfferings.SendUpdatePackets(otherPlayer); + myOfferings.DoneSendUpdate(); + + otherTrader = otherPlayer; + isTradeAccepted = false; + } + + public Player GetOtherTrader() + { + return otherTrader; + } + + public ItemPackage GetTradeOfferings() + { + return myOfferings; + } + + public bool IsTrading() + { + return otherTrader != null; + } + + public bool IsTradeAccepted() + { + return isTradeAccepted; + } + + public void AddTradeItem(ushort slot, ushort linkedSlot, int subquantity) + { + if (!IsTrading()) + return; + + InventoryItem mine = itemPackages[ItemPackage.NORMAL].GetItemAtSlot(linkedSlot); + + InventoryItem tradeItem = new InventoryItem(mine, slot); + + myOfferings.StartSendUpdate(); + myOfferings.AddItem(mine.itemId, mine.quantity, mine.quality); + myOfferings.SendUpdatePackets(otherTrader); + myOfferings.DoneSendUpdate(); + } + + public void AddTradeGil(int quantity) + { + if (!IsTrading()) + return; + + myOfferings.StartSendUpdate(); + myOfferings.AddItem(1000001, quantity, 1); + myOfferings.SendUpdatePackets(otherTrader); + myOfferings.DoneSendUpdate(); + } + + public void RemoveTradeItem(ushort slot) + { + if (!IsTrading()) + return; + + myOfferings.StartSendUpdate(); + myOfferings.RemoveItemAtSlot(slot); + myOfferings.SendUpdatePackets(otherTrader); + myOfferings.DoneSendUpdate(); + } + + public void ClearTradeItems(ushort slot) + { + if (!IsTrading()) + return; + + myOfferings.StartSendUpdate(); + myOfferings.Clear(); + myOfferings.SendUpdatePackets(otherTrader); + myOfferings.DoneSendUpdate(); + } + + public void AcceptTrade(bool accepted) + { + if (!IsTrading()) + return; + isTradeAccepted = accepted; + } + + public void FinishTradeTransaction() + { + isTradeAccepted = false; + myOfferings = null; + otherTrader = null; + } + + public void Test() + { + QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId)); + QueuePacket(InventorySetBeginPacket.BuildPacket(actorId, 4, ItemPackage.TRADE)); + + QueuePacket(InventoryRemoveX01Packet.BuildPacket(actorId, 1)); + + QueuePacket(InventorySetEndPacket.BuildPacket(actorId)); + QueuePacket(InventoryEndChangePacket.BuildPacket(actorId)); + } + public void Test2() + { + QueuePacket(InventoryBeginChangePacket.BuildPacket(actorId)); + QueuePacket(InventorySetBeginPacket.BuildPacket(actorId, 4, ItemPackage.TRADE)); + + QueuePacket(EquipmentListX01Packet.BuildPacket(actorId, 1, 1)); + + QueuePacket(InventorySetEndPacket.BuildPacket(actorId)); + QueuePacket(InventoryEndChangePacket.BuildPacket(actorId)); + } + } } diff --git a/FFXIVClassic Map Server/actors/director/Director.cs b/FFXIVClassic Map Server/actors/director/Director.cs index db46a3cd..3f3c5a6b 100644 --- a/FFXIVClassic Map Server/actors/director/Director.cs +++ b/FFXIVClassic Map Server/actors/director/Director.cs @@ -8,7 +8,6 @@ using FFXIVClassic_Map_Server.packets.send.actor; using MoonSharp.Interpreter; using System; using System.Collections.Generic; -using System.IO; namespace FFXIVClassic_Map_Server.actors.director { diff --git a/FFXIVClassic Map Server/actors/director/GuildleveDirector.cs b/FFXIVClassic Map Server/actors/director/GuildleveDirector.cs index 0bfa49a4..578fefc9 100644 --- a/FFXIVClassic Map Server/actors/director/GuildleveDirector.cs +++ b/FFXIVClassic Map Server/actors/director/GuildleveDirector.cs @@ -1,15 +1,10 @@ using FFXIVClassic.Common; -using FFXIVClassic_Map_Server.actors.area; using FFXIVClassic_Map_Server.actors.director.Work; -using FFXIVClassic_Map_Server.actors.group; using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.dataobjects; using FFXIVClassic_Map_Server.utils; using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.actors.director { diff --git a/FFXIVClassic Map Server/actors/director/Work/GuildleveWork.cs b/FFXIVClassic Map Server/actors/director/Work/GuildleveWork.cs index 105a427d..c69929c4 100644 --- a/FFXIVClassic Map Server/actors/director/Work/GuildleveWork.cs +++ b/FFXIVClassic Map Server/actors/director/Work/GuildleveWork.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FFXIVClassic_Map_Server.actors.director.Work +namespace FFXIVClassic_Map_Server.actors.director.Work { class GuildleveWork diff --git a/FFXIVClassic Map Server/actors/group/ContentGroup.cs b/FFXIVClassic Map Server/actors/group/ContentGroup.cs index ca15fcbd..673a620f 100644 --- a/FFXIVClassic Map Server/actors/group/ContentGroup.cs +++ b/FFXIVClassic Map Server/actors/group/ContentGroup.cs @@ -5,12 +5,7 @@ using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.dataobjects; using FFXIVClassic_Map_Server.packets.send.group; using FFXIVClassic_Map_Server.packets.send.groups; -using FFXIVClassic_Map_Server.utils; -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.actors.group { diff --git a/FFXIVClassic Map Server/actors/group/GLContentGroup.cs b/FFXIVClassic Map Server/actors/group/GLContentGroup.cs index ada138f3..169d58e2 100644 --- a/FFXIVClassic Map Server/actors/group/GLContentGroup.cs +++ b/FFXIVClassic Map Server/actors/group/GLContentGroup.cs @@ -1,16 +1,4 @@ -using FFXIVClassic.Common; -using FFXIVClassic_Map_Server.actors.director; -using FFXIVClassic_Map_Server.actors.group.Work; -using FFXIVClassic_Map_Server.Actors; -using FFXIVClassic_Map_Server.dataobjects; -using FFXIVClassic_Map_Server.packets.send.group; -using FFXIVClassic_Map_Server.packets.send.groups; -using FFXIVClassic_Map_Server.utils; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using FFXIVClassic_Map_Server.actors.director; namespace FFXIVClassic_Map_Server.actors.group { diff --git a/FFXIVClassic Map Server/actors/group/Group.cs b/FFXIVClassic Map Server/actors/group/Group.cs index c8a24047..6b15364c 100644 --- a/FFXIVClassic Map Server/actors/group/Group.cs +++ b/FFXIVClassic Map Server/actors/group/Group.cs @@ -2,7 +2,6 @@ using FFXIVClassic_Map_Server.dataobjects; using FFXIVClassic_Map_Server.packets.send.group; using FFXIVClassic_Map_Server.packets.send.groups; -using System; using System.Collections.Generic; namespace FFXIVClassic_Map_Server.actors.group diff --git a/FFXIVClassic Map Server/actors/group/MonsterParty.cs b/FFXIVClassic Map Server/actors/group/MonsterParty.cs index 7c0b344f..ba1085d9 100644 --- a/FFXIVClassic Map Server/actors/group/MonsterParty.cs +++ b/FFXIVClassic Map Server/actors/group/MonsterParty.cs @@ -2,11 +2,7 @@ using FFXIVClassic_Map_Server.dataobjects; using FFXIVClassic_Map_Server.packets.send.group; using FFXIVClassic_Map_Server.packets.send.groups; -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.actors.group { diff --git a/FFXIVClassic Map Server/actors/group/Party.cs b/FFXIVClassic Map Server/actors/group/Party.cs index 58e438dd..9f7e62b8 100644 --- a/FFXIVClassic Map Server/actors/group/Party.cs +++ b/FFXIVClassic Map Server/actors/group/Party.cs @@ -1,12 +1,6 @@ -using FFXIVClassic.Common; -using FFXIVClassic_Map_Server.actors.group.Work; -using FFXIVClassic_Map_Server.dataobjects; +using FFXIVClassic_Map_Server.actors.group.Work; using FFXIVClassic_Map_Server.packets.send.group; -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.actors.group { diff --git a/FFXIVClassic Map Server/actors/group/Relation.cs b/FFXIVClassic Map Server/actors/group/RelationGroup.cs similarity index 91% rename from FFXIVClassic Map Server/actors/group/Relation.cs rename to FFXIVClassic Map Server/actors/group/RelationGroup.cs index 600c8b9c..0afa2570 100644 --- a/FFXIVClassic Map Server/actors/group/Relation.cs +++ b/FFXIVClassic Map Server/actors/group/RelationGroup.cs @@ -3,21 +3,17 @@ using FFXIVClassic_Map_Server.actors.group.Work; using FFXIVClassic_Map_Server.dataobjects; using FFXIVClassic_Map_Server.packets.send.group; using FFXIVClassic_Map_Server.packets.send.groups; -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.actors.group { - class Relation : Group + class RelationGroup : Group { public RelationWork work = new RelationWork(); private uint charaOther; private ulong topicGroup; - public Relation(ulong groupIndex, uint host, uint other, uint command, ulong topicGroup) : base (groupIndex) + public RelationGroup(ulong groupIndex, uint host, uint other, uint command, ulong topicGroup) : base (groupIndex) { this.charaOther = other; work._globalTemp.host = ((ulong)host << 32) | (0xc17909); diff --git a/FFXIVClassic Map Server/actors/group/RetainerMeetingRelationGroup.cs b/FFXIVClassic Map Server/actors/group/RetainerMeetingRelationGroup.cs index bbab8b32..6a428122 100644 --- a/FFXIVClassic Map Server/actors/group/RetainerMeetingRelationGroup.cs +++ b/FFXIVClassic Map Server/actors/group/RetainerMeetingRelationGroup.cs @@ -4,11 +4,7 @@ using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.dataobjects; using FFXIVClassic_Map_Server.packets.send.group; using FFXIVClassic_Map_Server.packets.send.groups; -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.actors.group { diff --git a/FFXIVClassic Map Server/actors/group/TradeGroup.cs b/FFXIVClassic Map Server/actors/group/TradeGroup.cs new file mode 100644 index 00000000..92e2da6b --- /dev/null +++ b/FFXIVClassic Map Server/actors/group/TradeGroup.cs @@ -0,0 +1,73 @@ +using FFXIVClassic.Common; +using FFXIVClassic_Map_Server.actors.group.Work; +using FFXIVClassic_Map_Server.dataobjects; +using FFXIVClassic_Map_Server.packets.send.group; +using FFXIVClassic_Map_Server.packets.send.groups; +using System.Collections.Generic; + +namespace FFXIVClassic_Map_Server.actors.group +{ + class TradeGroup : Group + { + public RelationWork work = new RelationWork(); + private uint charaOther; + private ulong topicGroup; + + public TradeGroup(ulong groupIndex, uint host, uint other) + : base(groupIndex) + { + this.charaOther = other; + work._globalTemp.host = ((ulong)host << 32) | (0xc17909); + work._globalTemp.variableCommand = 30001; + } + + public uint GetHost() + { + return (uint)(((ulong)work._globalTemp.host >> 32) & 0xFFFFFFFF); + } + + public uint GetOther() + { + return charaOther; + } + + public override int GetMemberCount() + { + return 2; + } + + public override uint GetTypeId() + { + return Group.TradeRelationGroup; + } + + public ulong GetTopicGroupIndex() + { + return topicGroup; + } + + public override List BuildMemberList(uint id) + { + List groupMembers = new List(); + + uint hostId = (uint)((work._globalTemp.host >> 32) & 0xFFFFFFFF); + + groupMembers.Add(new GroupMember(hostId, -1, 0, false, Server.GetServer().GetSession(hostId) != null, Server.GetWorldManager().GetActorInWorld(hostId).customDisplayName)); + groupMembers.Add(new GroupMember(charaOther, -1, 0, false, Server.GetServer().GetSession(charaOther) != null, Server.GetWorldManager().GetActorInWorld(charaOther).customDisplayName)); + return groupMembers; + } + + public override void SendInitWorkValues(Session session) + { + SynchGroupWorkValuesPacket groupWork = new SynchGroupWorkValuesPacket(groupIndex); + groupWork.addProperty(this, "work._globalTemp.host"); + groupWork.addProperty(this, "work._globalTemp.variableCommand"); + groupWork.setTarget("/_init"); + + SubPacket test = groupWork.buildPacket(session.id); + test.DebugPrintSubPacket(); + session.QueuePacket(test); + } + + } +} diff --git a/FFXIVClassic Map Server/actors/group/work/ContentGroupWork.cs b/FFXIVClassic Map Server/actors/group/work/ContentGroupWork.cs index 9029474f..85f0a929 100644 --- a/FFXIVClassic Map Server/actors/group/work/ContentGroupWork.cs +++ b/FFXIVClassic Map Server/actors/group/work/ContentGroupWork.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace FFXIVClassic_Map_Server.actors.group.Work +namespace FFXIVClassic_Map_Server.actors.group.Work { class ContentGroupWork { diff --git a/FFXIVClassic Map Server/actors/group/work/GlobalTemp.cs b/FFXIVClassic Map Server/actors/group/work/GlobalTemp.cs index 4faf2864..6aa7e98d 100644 --- a/FFXIVClassic Map Server/actors/group/work/GlobalTemp.cs +++ b/FFXIVClassic Map Server/actors/group/work/GlobalTemp.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace FFXIVClassic_Map_Server.actors.group.Work +namespace FFXIVClassic_Map_Server.actors.group.Work { class GlobalTemp { diff --git a/FFXIVClassic Map Server/actors/group/work/GroupGlobalSave.cs b/FFXIVClassic Map Server/actors/group/work/GroupGlobalSave.cs index 3027fd05..e6ff8e0e 100644 --- a/FFXIVClassic Map Server/actors/group/work/GroupGlobalSave.cs +++ b/FFXIVClassic Map Server/actors/group/work/GroupGlobalSave.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FFXIVClassic_Map_Server.actors.group.Work +namespace FFXIVClassic_Map_Server.actors.group.Work { class GroupGlobalSave { diff --git a/FFXIVClassic Map Server/actors/group/work/GroupGlobalTemp.cs b/FFXIVClassic Map Server/actors/group/work/GroupGlobalTemp.cs index 18a1f826..33ccf7de 100644 --- a/FFXIVClassic Map Server/actors/group/work/GroupGlobalTemp.cs +++ b/FFXIVClassic Map Server/actors/group/work/GroupGlobalTemp.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FFXIVClassic_Map_Server.actors.group.Work +namespace FFXIVClassic_Map_Server.actors.group.Work { class GroupGlobalTemp { diff --git a/FFXIVClassic Map Server/actors/group/work/GroupMemberSave.cs b/FFXIVClassic Map Server/actors/group/work/GroupMemberSave.cs index 011e5b0a..ebbba2d8 100644 --- a/FFXIVClassic Map Server/actors/group/work/GroupMemberSave.cs +++ b/FFXIVClassic Map Server/actors/group/work/GroupMemberSave.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FFXIVClassic_Map_Server.actors.group.Work +namespace FFXIVClassic_Map_Server.actors.group.Work { class GroupMemberSave { diff --git a/FFXIVClassic Map Server/actors/group/work/PartyWork.cs b/FFXIVClassic Map Server/actors/group/work/PartyWork.cs index d3b75640..e3c6adcc 100644 --- a/FFXIVClassic Map Server/actors/group/work/PartyWork.cs +++ b/FFXIVClassic Map Server/actors/group/work/PartyWork.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FFXIVClassic_Map_Server.actors.group.Work +namespace FFXIVClassic_Map_Server.actors.group.Work { class PartyWork { diff --git a/FFXIVClassic Map Server/actors/group/work/RelationWork.cs b/FFXIVClassic Map Server/actors/group/work/RelationWork.cs index b6f2f33a..1b275e39 100644 --- a/FFXIVClassic Map Server/actors/group/work/RelationWork.cs +++ b/FFXIVClassic Map Server/actors/group/work/RelationWork.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FFXIVClassic_Map_Server.actors.group.Work +namespace FFXIVClassic_Map_Server.actors.group.Work { class RelationWork { diff --git a/FFXIVClassic Map Server/actors/quest/Quest.cs b/FFXIVClassic Map Server/actors/quest/Quest.cs index 109f8570..2011fc36 100644 --- a/FFXIVClassic Map Server/actors/quest/Quest.cs +++ b/FFXIVClassic Map Server/actors/quest/Quest.cs @@ -1,5 +1,4 @@ -using FFXIVClassic.Common; -using FFXIVClassic_Map_Server.lua; +using FFXIVClassic_Map_Server.lua; using Newtonsoft.Json; using System; using System.Collections.Generic; diff --git a/FFXIVClassic Map Server/dataobjects/GuildleveData.cs b/FFXIVClassic Map Server/dataobjects/GuildleveData.cs index 32834f07..f50017a2 100644 --- a/FFXIVClassic Map Server/dataobjects/GuildleveData.cs +++ b/FFXIVClassic Map Server/dataobjects/GuildleveData.cs @@ -1,9 +1,4 @@ using MySql.Data.MySqlClient; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.dataobjects { diff --git a/FFXIVClassic Map Server/dataobjects/InventoryItem.cs b/FFXIVClassic Map Server/dataobjects/InventoryItem.cs index 13c51499..284ecb57 100644 --- a/FFXIVClassic Map Server/dataobjects/InventoryItem.cs +++ b/FFXIVClassic Map Server/dataobjects/InventoryItem.cs @@ -1,73 +1,165 @@ -using System; +using FFXIVClassic_Map_Server.Actors; +using FFXIVClassic_Map_Server.packets.send.actor.inventory; +using System; using System.IO; namespace FFXIVClassic_Map_Server.dataobjects { class InventoryItem { + public const byte DEALINGMODE_NONE = 0; + public const byte DEALINGMODE_REFERENCED = 1; + public const byte DEALINGMODE_PRICED = 2; + + public const byte TAG_EXCLUSIVE = 0x3; + public const byte TAG_DEALING = 0xC9; + public const byte TAG_ATTACHED = 0xCA; + + public const byte TYPE_SINGLE = 11; + public const byte TYPE_MULTI = 12; + public const byte TYPE_STACK = 13; + public const byte TYPE_SEEK_ITEM = 20; + public const byte TYPE_SEEK_REPAIR = 30; + public ulong uniqueId; public uint itemId; public int quantity = 1; - public ushort slot; - public byte itemType; + public byte dealingVal = 0; + public byte dealingMode = DEALINGMODE_NONE; + public uint dealingAttached1 = 0; + public uint dealingAttached2 = 0; + public uint dealingAttached3 = 0; + + public byte[] tags = new byte[4]; + public byte[] tagValues = new byte[4]; + public byte quality = 1; - public int durability = 0; - public ushort spiritbind = 0; + private ulong attachedTo = 0; - public byte materia1 = 0; - public byte materia2 = 0; - public byte materia3 = 0; - public byte materia4 = 0; - public byte materia5 = 0; + public ItemModifier modifiers; + + public readonly ItemData itemData; + public Character owner = null; + public ushort slot = 0xFFFF; + public ushort itemPackage = 0xFFFF; + + public class ItemModifier + { + public uint durability = 0; + public ushort use = 0; + public uint materiaId = 0; + public uint materiaLife = 0; + public byte mainQuality = 0; + public byte[] subQuality = new byte[3]; + public uint polish = 0; + public uint param1 = 0; + public uint param2 = 0; + public uint param3 = 0; + public ushort spiritbind = 0; + public byte[] materiaType = new byte[5]; + public byte[] materiaGrade = new byte[5]; + + public ItemModifier() + { + } + + public ItemModifier(MySql.Data.MySqlClient.MySqlDataReader reader) + { + durability = reader.GetUInt32("durability"); + mainQuality = reader.GetByte("mainQuality"); + subQuality[0] = reader.GetByte("subQuality1"); + subQuality[1] = reader.GetByte("subQuality2"); + subQuality[2] = reader.GetByte("subQuality3"); + param1 = reader.GetUInt32("param1"); + param2 = reader.GetUInt32("param2"); + param3 = reader.GetUInt32("param3"); + spiritbind = reader.GetUInt16("spiritbind"); + + ushort materia1 = reader.GetUInt16("materia1"); + ushort materia2 = reader.GetUInt16("materia2"); + ushort materia3 = reader.GetUInt16("materia3"); + ushort materia4 = reader.GetUInt16("materia4"); + ushort materia5 = reader.GetUInt16("materia5"); + + materiaType[0] = (byte)(materia1 & 0xFF); + materiaGrade[0] = (byte)((materia1 >> 8) & 0xFF); + materiaType[1] = (byte)(materia2 & 0xFF); + materiaGrade[1] = (byte)((materia2 >> 8) & 0xFF); + materiaType[2] = (byte)(materia3 & 0xFF); + materiaGrade[2] = (byte)((materia3 >> 8) & 0xFF); + materiaType[3] = (byte)(materia4 & 0xFF); + materiaGrade[3] = (byte)((materia4 >> 8) & 0xFF); + materiaType[4] = (byte)(materia5 & 0xFF); + materiaGrade[4] = (byte)((materia5 >> 8) & 0xFF); + } + + public void WriteBytes(BinaryWriter binWriter) + { + binWriter.Write((UInt32) durability); + binWriter.Write((UInt16) use); + binWriter.Write((UInt32) materiaId); + binWriter.Write((UInt32) materiaLife); + binWriter.Write((Byte) mainQuality); + binWriter.Write((Byte) subQuality[0]); + binWriter.Write((Byte) subQuality[1]); + binWriter.Write((Byte) subQuality[2]); + binWriter.Write((UInt32) polish); + binWriter.Write((UInt32) param1); + binWriter.Write((UInt32) param2); + binWriter.Write((UInt32) param3); + binWriter.Write((UInt16) spiritbind); + binWriter.Write((Byte) materiaType[0]); + binWriter.Write((Byte) materiaType[1]); + binWriter.Write((Byte) materiaType[2]); + binWriter.Write((Byte) materiaType[3]); + binWriter.Write((Byte) materiaType[4]); + binWriter.Write((Byte) materiaGrade[0]); + binWriter.Write((Byte) materiaGrade[1]); + binWriter.Write((Byte) materiaGrade[2]); + binWriter.Write((Byte) materiaGrade[3]); + binWriter.Write((Byte) materiaGrade[4]); + } + } //Bare Minimum - public InventoryItem(uint id, uint itemId) + public InventoryItem(uint id, ItemData data) { this.uniqueId = id; - this.itemId = itemId; + this.itemId = data.catalogID; + this.itemData = data; this.quantity = 1; ItemData gItem = Server.GetItemGamedata(itemId); - itemType = gItem.isExclusive ? (byte)0x3 : (byte)0x0; + tags[1] = gItem.isExclusive ? (byte)0x3 : (byte)0x0; } //For check command public InventoryItem(InventoryItem item, ushort equipSlot) { this.uniqueId = item.uniqueId; + this.itemData = item.itemData; this.itemId = item.itemId; this.quantity = item.quantity; this.slot = equipSlot; - this.itemType = item.itemType; + this.tags = item.tags; + this.tagValues = item.tagValues; + this.quality = item.quality; - this.durability = item.durability; - this.spiritbind = item.spiritbind; - - this.materia1 = item.materia1; - this.materia2 = item.materia2; - this.materia3 = item.materia3; - this.materia4 = item.materia4; - this.materia5 = item.materia5; + this.modifiers = item.modifiers; } - public InventoryItem(uint uniqueId, uint itemId, int quantity, byte itemType, byte qualityNumber, int durability, ushort spiritbind, byte materia1, byte materia2, byte materia3, byte materia4, byte materia5) + public InventoryItem(uint uniqueId, ItemData itemData, int quantity, byte qualityNumber, ItemModifier modifiers = null) { this.uniqueId = uniqueId; - this.itemId = itemId; + this.itemId = itemData.catalogID; + this.itemData = itemData; this.quantity = quantity; - this.itemType = itemType; this.quality = qualityNumber; - this.durability = durability; - this.spiritbind = spiritbind; - this.materia1 = materia1; - this.materia2 = materia2; - this.materia3 = materia3; - this.materia4 = materia4; - this.materia5 = materia5; + this.modifiers = modifiers; } public byte[] ToPacketBytes() @@ -83,40 +175,161 @@ namespace FFXIVClassic_Map_Server.dataobjects binWriter.Write((UInt32)itemId); binWriter.Write((UInt16)slot); - binWriter.Write((UInt16)0x0001); - binWriter.Write((UInt32)0x00000000); - binWriter.Write((UInt32)0x00000000); - binWriter.Write((UInt32)0x00000000); + binWriter.Write((Byte)dealingVal); + binWriter.Write((Byte)dealingMode); - binWriter.Write((UInt32)itemType); + binWriter.Write((UInt32)dealingAttached1); + binWriter.Write((UInt32)dealingAttached2); + binWriter.Write((UInt32)dealingAttached3); - binWriter.Write((UInt32)0x00000000); + for (int i = 0; i < tags.Length; i++) + binWriter.Write((Byte) tags[i]); + for (int i = 0; i < tagValues.Length; i++) + binWriter.Write((Byte) tagValues[i]); - binWriter.Write((byte)quality); - binWriter.Write((byte)0x01); - binWriter.Write((uint)durability); - - binWriter.BaseStream.Seek(0x10-0x06, SeekOrigin.Current); - - binWriter.Write((byte)0x01); - binWriter.Write((byte)0x01); - binWriter.Write((byte)0x01); - binWriter.Write((byte)0x01); - - binWriter.BaseStream.Seek(0x10, SeekOrigin.Current); - - binWriter.Write((ushort)spiritbind); - - binWriter.Write((byte)materia1); - binWriter.Write((byte)materia2); - binWriter.Write((byte)materia3); - binWriter.Write((byte)materia4); - binWriter.Write((byte)materia5); + binWriter.Write((Byte)quality); + + if (modifiers != null) + { + binWriter.Write((Byte)0x01); + modifiers.WriteBytes(binWriter); + } } } return data; } + public void SetQuantity(uint quantity) + { + lock (owner.GetItemPackage(itemPackage)) + { + this.quantity = (int)quantity; + if (quantity < 0) + quantity = 0; + Database.SetQuantity(uniqueId, this.quantity); + + if (owner != null && owner is Player) + owner.GetItemPackage(itemPackage).RefreshItem((Player)owner, this); + } + } + + public void ChangeQuantity(int quantityDelta) + { + lock (owner.GetItemPackage(itemPackage)) + { + this.quantity += quantityDelta; + if (quantity < 0) + quantity = 0; + + if (quantity == 0) + { + owner.RemoveItem(this); + return; + } + + Database.SetQuantity(uniqueId, this.quantity); + + if (owner != null && owner is Player) + { + + ((Player)owner).QueuePacket(InventoryBeginChangePacket.BuildPacket(owner.actorId, false)); + owner.GetItemPackage(itemPackage).RefreshItem((Player)owner, this); + ((Player)owner).QueuePacket(InventoryEndChangePacket.BuildPacket(owner.actorId)); + } + } + } + + public void RefreshPositioning(Character owner, ushort itemPackage, ushort slot) + { + this.owner = owner; + this.itemPackage = itemPackage; + this.slot = slot; + } + + public void SetExclusive(bool isExclusive) + { + tags[1] = isExclusive ? TAG_EXCLUSIVE : (byte)0; + } + + public void SetHasAttached(bool isAttached) + { + tags[0] = isAttached ? TAG_ATTACHED : (byte)0; + } + + public void SetNormal() + { + for (int i = 0; i < 4; i++) + { + if (tags[i] == TAG_DEALING || tags[i] == TAG_ATTACHED) + { + tags[i] = 0; + tagValues[i] = 0; + attachedTo = 0; + dealingVal = 0; + dealingMode = 0; + dealingAttached1 = 0; + dealingAttached2 = 0; + dealingAttached3 = 0; + } + } + } + + public void SetDealing(byte mode, int price) + { + tags[0] = TAG_DEALING; + tagValues[0] = mode; + + if (mode == TYPE_SINGLE || mode == TYPE_MULTI || mode == TYPE_STACK) + { + dealingVal = 1; + dealingMode = DEALINGMODE_PRICED; + dealingAttached1 = 1; + dealingAttached2 = (uint) price; + dealingAttached3 = 0; + } + } + + public void SetDealingAttached(byte mode, ulong attached) + { + tags[0] = TAG_DEALING; + tagValues[0] = mode; + attachedTo = attached; + } + + public ulong GetAttached() + { + return attachedTo; + } + + public void SetAttachedIndex(ushort package, ushort index) + { + dealingVal = 1; + dealingMode = DEALINGMODE_REFERENCED; + dealingAttached1 = (uint)((package << 16) | index); + dealingAttached2 = 0; + dealingAttached3 = 0; + } + + public ItemData GetItemData() + { + return itemData; + } + + public byte GetBazaarMode() + { + for (int i = 0; i < tags.Length; i++) + { + if (tags[i] == 0xC9) + return tagValues[i]; + } + + return 0; + } + + public bool IsSelling() + { + return GetBazaarMode() == TYPE_SINGLE || GetBazaarMode() == TYPE_MULTI || GetBazaarMode() == TYPE_STACK; + } } } diff --git a/FFXIVClassic Map Server/dataobjects/SeamlessBoundry.cs b/FFXIVClassic Map Server/dataobjects/SeamlessBoundry.cs index 9e78f1eb..9d4fbcb3 100644 --- a/FFXIVClassic Map Server/dataobjects/SeamlessBoundry.cs +++ b/FFXIVClassic Map Server/dataobjects/SeamlessBoundry.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FFXIVClassic_Map_Server.dataobjects +namespace FFXIVClassic_Map_Server.dataobjects { class SeamlessBoundry { diff --git a/FFXIVClassic Map Server/dataobjects/TradeTransaction.cs b/FFXIVClassic Map Server/dataobjects/TradeTransaction.cs new file mode 100644 index 00000000..a3f09c86 --- /dev/null +++ b/FFXIVClassic Map Server/dataobjects/TradeTransaction.cs @@ -0,0 +1,3 @@ +namespace FFXIVClassic_Map_Server.dataobjects +{ +} diff --git a/FFXIVClassic Map Server/dataobjects/ZoneConnection.cs b/FFXIVClassic Map Server/dataobjects/ZoneConnection.cs index ef4ab7bf..6e6833bb 100644 --- a/FFXIVClassic Map Server/dataobjects/ZoneConnection.cs +++ b/FFXIVClassic Map Server/dataobjects/ZoneConnection.cs @@ -4,7 +4,6 @@ using System.Net.Sockets; using FFXIVClassic.Common; using System.Collections.Concurrent; using System.Net; -using System.Collections.Generic; using FFXIVClassic_Map_Server.packets.WorldPackets.Send; namespace FFXIVClassic_Map_Server.dataobjects @@ -19,7 +18,7 @@ namespace FFXIVClassic_Map_Server.dataobjects public void QueuePacket(SubPacket subpacket) { - if(SendPacketQueue.Count == 1000) + if (SendPacketQueue.Count == SendPacketQueue.BoundedCapacity - 1) FlushQueuedSendPackets(); SendPacketQueue.Add(subpacket); diff --git a/FFXIVClassic Map Server/lua/LuaEngine.cs b/FFXIVClassic Map Server/lua/LuaEngine.cs index 9382f4cb..65e6728a 100644 --- a/FFXIVClassic Map Server/lua/LuaEngine.cs +++ b/FFXIVClassic Map Server/lua/LuaEngine.cs @@ -11,8 +11,6 @@ using MoonSharp.Interpreter.Loaders; using System; using System.Collections.Generic; using System.IO; -using System.Diagnostics; -using FFXIVClassic_Map_Server.lua; using FFXIVClassic.Common; using FFXIVClassic_Map_Server.actors.area; using System.Threading; @@ -93,7 +91,7 @@ namespace FFXIVClassic_Map_Server.lua } } - public void OnSignal(string signal) + public void OnSignal(string signal, params object[] args) { List mToAwake = new List(); @@ -105,7 +103,7 @@ namespace FFXIVClassic_Map_Server.lua foreach (Coroutine key in mToAwake) { - DynValue value = key.Resume(); + DynValue value = key.Resume(args); ResolveResume(null, key, value); } } @@ -642,6 +640,7 @@ namespace FFXIVClassic_Map_Server.lua public static void RunGMCommand(Player player, String cmd, string[] param, bool help = false) { bool playerNull = player == null; + if (playerNull) { if (param.Length >= 2 && param[1].Contains("\"")) @@ -649,6 +648,10 @@ namespace FFXIVClassic_Map_Server.lua else if (param.Length > 2) player = Server.GetWorldManager().GetPCInWorld(param[1] + param[2]); } + + if (playerNull && param.Length >= 3) + player = Server.GetWorldManager().GetPCInWorld(param[1] + " " + param[2]); + // load from scripts/commands/gm/ directory var path = String.Format("./scripts/commands/gm/{0}.lua", cmd.ToLower()); diff --git a/FFXIVClassic Map Server/lua/LuaScript.cs b/FFXIVClassic Map Server/lua/LuaScript.cs index 6442ceca..1357e171 100644 --- a/FFXIVClassic Map Server/lua/LuaScript.cs +++ b/FFXIVClassic Map Server/lua/LuaScript.cs @@ -1,9 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using MoonSharp; using MoonSharp.Interpreter; using NLog; using MoonSharp.Interpreter.Debugging; diff --git a/FFXIVClassic Map Server/lua/LuaUtils.cs b/FFXIVClassic Map Server/lua/LuaUtils.cs index f1181564..7c324a3a 100644 --- a/FFXIVClassic Map Server/lua/LuaUtils.cs +++ b/FFXIVClassic Map Server/lua/LuaUtils.cs @@ -12,19 +12,37 @@ namespace FFXIVClassic_Map_Server class LuaUtils { - public class Type7Param + public class ItemRefParam { public uint actorId; public byte unknown; public byte slot; - public byte inventoryType; + public byte itemPackage; - public Type7Param(uint actorId, byte unknown, byte slot, byte inventoryType) + public ItemRefParam(uint actorId, byte unknown, byte slot, byte itemPackage) { this.actorId = actorId; this.unknown = unknown; this.slot = slot; - this.inventoryType = inventoryType; + this.itemPackage = itemPackage; + } + } + + public class ItemOfferParam + { + public uint actorId; + public ushort offerSlot; + public ushort unknown1; + public ushort seekSlot; + public ushort unknown2; + + public ItemOfferParam(uint actorId, ushort unknown1, ushort offerSlot, ushort seekSlot, ushort unknown2) + { + this.actorId = actorId; + this.unknown1 = unknown1; + this.offerSlot = offerSlot; + this.seekSlot = seekSlot; + this.unknown2 = unknown2; } } @@ -81,13 +99,25 @@ namespace FFXIVClassic_Map_Server case 0x6: //Actor (By Id) value = Utils.SwapEndian(reader.ReadUInt32()); break; - case 0x7: //Weird one used for inventory - uint type7ActorId = Utils.SwapEndian(reader.ReadUInt32()); - byte type7Unknown = reader.ReadByte(); - byte type7Slot = reader.ReadByte(); - byte type7InventoryType = reader.ReadByte(); - value = new Type7Param(type7ActorId, type7Unknown, type7Slot, type7InventoryType); + case 0x7: //Item Reference to Inventory Spot + { + uint type7ActorId = Utils.SwapEndian(reader.ReadUInt32()); + byte type7Unknown = reader.ReadByte(); + byte type7Slot = reader.ReadByte(); + byte type7InventoryType = reader.ReadByte(); + value = new ItemRefParam(type7ActorId, type7Unknown, type7Slot, type7InventoryType); + } break; + case 0x8: //Used for offering + { + uint actorId = Utils.SwapEndian(reader.ReadUInt32()); + ushort unk1 = Utils.SwapEndian(reader.ReadUInt16()); + ushort offerSlot = Utils.SwapEndian(reader.ReadUInt16()); + ushort seekSlot = Utils.SwapEndian(reader.ReadUInt16()); + ushort unk2 = Utils.SwapEndian(reader.ReadUInt16()); + value = new ItemOfferParam(actorId, unk1, offerSlot, seekSlot, unk2); + } + break; case 0x9: //Two Longs (only storing first one) value = new Type9Param(Utils.SwapEndian(reader.ReadUInt64()), Utils.SwapEndian(reader.ReadUInt64())); break; @@ -105,7 +135,13 @@ namespace FFXIVClassic_Map_Server if (isDone) break; - if (value != null) + //Special case cause fuck Type8 + if (value != null && value is ItemOfferParam) + { + luaParams.Add(new LuaParam(code, value)); + luaParams.Add(new LuaParam(5, null)); + } + else if (value != null) luaParams.Add(new LuaParam(code, value)); else if (wasNil) luaParams.Add(new LuaParam(code, value)); @@ -152,11 +188,11 @@ namespace FFXIVClassic_Map_Server writer.Write((UInt32)Utils.SwapEndian((UInt32)l.value)); break; case 0x7: //Weird one used for inventory - Type7Param type7 = (Type7Param)l.value; + ItemRefParam type7 = (ItemRefParam)l.value; writer.Write((UInt32)Utils.SwapEndian((UInt32)type7.actorId)); writer.Write((Byte)type7.unknown); writer.Write((Byte)type7.slot); - writer.Write((Byte)type7.inventoryType); + writer.Write((Byte)type7.itemPackage); break; case 0x9: //Two Longs (only storing first one) writer.Write((UInt64)Utils.SwapEndian(((Type9Param)l.value).item1)); @@ -226,7 +262,7 @@ namespace FFXIVClassic_Map_Server byte type7Unknown = reader.ReadByte(); byte type7Slot = reader.ReadByte(); byte type7InventoryType = reader.ReadByte(); - value = new Type7Param(type7ActorId, type7Unknown, type7Slot, type7InventoryType); + value = new ItemRefParam(type7ActorId, type7Unknown, type7Slot, type7InventoryType); break; case 0x9: //Two Longs (only storing first one) value = new Type9Param(Utils.SwapEndian(reader.ReadUInt64()), Utils.SwapEndian(reader.ReadUInt64())); @@ -359,9 +395,13 @@ namespace FFXIVClassic_Map_Server { luaParams.Add(new LuaParam(0x6, ((Actor)o).actorId)); } - else if (o is Type7Param) + else if (o is ItemRefParam) { - luaParams.Add(new LuaParam(0x7, (Type7Param)o)); + luaParams.Add(new LuaParam(0x7, (ItemRefParam)o)); + } + else if (o is ItemOfferParam) + { + luaParams.Add(new LuaParam(0x8, (ItemOfferParam)o)); } else if (o is Type9Param) { @@ -416,16 +456,20 @@ namespace FFXIVClassic_Map_Server dumpString += String.Format("0x{0:X}", (uint)lParams[i].value); break; case 0x7: //Weird one used for inventory - Type7Param type7Param = ((Type7Param)lParams[i].value); - dumpString += String.Format("Type7 Param: (0x{0:X}, 0x{1:X}, 0x{2:X}, 0x{3:X})", type7Param.actorId, type7Param.unknown, type7Param.slot, type7Param.inventoryType); + ItemRefParam type7Param = ((ItemRefParam)lParams[i].value); + dumpString += String.Format("Type7 Param: (0x{0:X}, 0x{1:X}, 0x{2:X}, 0x{3:X})", type7Param.actorId, type7Param.unknown, type7Param.slot, type7Param.itemPackage); break; - case 0xC: //Byte - dumpString += String.Format("0x{0:X}", (byte)lParams[i].value); + case 0x8: //Weird one used for inventory + ItemOfferParam itemOfferParam = ((ItemOfferParam)lParams[i].value); + dumpString += String.Format("Type8 Param: (0x{0:X}, 0x{1:X}, 0x{2:X}, 0x{3:X}, 0x{4:X})", itemOfferParam.actorId, itemOfferParam.unknown1, itemOfferParam.offerSlot, itemOfferParam.seekSlot, itemOfferParam.unknown2); break; case 0x9: //Long (+ 8 bytes ignored) Type9Param type9Param = ((Type9Param)lParams[i].value); dumpString += String.Format("Type9 Param: (0x{0:X}, 0x{1:X})", type9Param.item1, type9Param.item2); break; + case 0xC: //Byte + dumpString += String.Format("0x{0:X}", (byte)lParams[i].value); + break; case 0x1B: //Short? dumpString += String.Format("0x{0:X}", (ushort)lParams[i].value); break; diff --git a/FFXIVClassic Map Server/packets/WorldPackets/Receive/ErrorPacket.cs b/FFXIVClassic Map Server/packets/WorldPackets/Receive/ErrorPacket.cs index ae31462d..a7722045 100644 --- a/FFXIVClassic Map Server/packets/WorldPackets/Receive/ErrorPacket.cs +++ b/FFXIVClassic Map Server/packets/WorldPackets/Receive/ErrorPacket.cs @@ -1,9 +1,5 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.WorldPackets.Receive { diff --git a/FFXIVClassic Map Server/packets/WorldPackets/Receive/LinkshellResultPacket.cs b/FFXIVClassic Map Server/packets/WorldPackets/Receive/LinkshellResultPacket.cs new file mode 100644 index 00000000..24d5192b --- /dev/null +++ b/FFXIVClassic Map Server/packets/WorldPackets/Receive/LinkshellResultPacket.cs @@ -0,0 +1,31 @@ +using System; +using System.IO; + +namespace FFXIVClassic_Map_Server.packets.WorldPackets.Receive +{ + class LinkshellResultPacket + { + public int resultCode; + + public bool invalidPacket = false; + + public LinkshellResultPacket(byte[] data) + { + using (MemoryStream mem = new MemoryStream(data)) + { + using (BinaryReader binReader = new BinaryReader(mem)) + { + try + { + resultCode = binReader.ReadInt32(); + } + catch (Exception) + { + invalidPacket = true; + } + } + } + + } + } +} diff --git a/FFXIVClassic Map Server/packets/WorldPackets/Receive/PartySyncPacket.cs b/FFXIVClassic Map Server/packets/WorldPackets/Receive/PartySyncPacket.cs index 92d7421e..aff6baff 100644 --- a/FFXIVClassic Map Server/packets/WorldPackets/Receive/PartySyncPacket.cs +++ b/FFXIVClassic Map Server/packets/WorldPackets/Receive/PartySyncPacket.cs @@ -1,10 +1,5 @@ -using FFXIVClassic_Map_Server.actors.group; -using System; -using System.Collections.Generic; +using System; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.WorldPackets.Receive { diff --git a/FFXIVClassic Map Server/packets/WorldPackets/Receive/SessionBeginPacket.cs b/FFXIVClassic Map Server/packets/WorldPackets/Receive/SessionBeginPacket.cs index f970004e..94a17102 100644 --- a/FFXIVClassic Map Server/packets/WorldPackets/Receive/SessionBeginPacket.cs +++ b/FFXIVClassic Map Server/packets/WorldPackets/Receive/SessionBeginPacket.cs @@ -1,9 +1,5 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.WorldPackets.Receive { diff --git a/FFXIVClassic Map Server/packets/WorldPackets/Receive/SessionEndPacket.cs b/FFXIVClassic Map Server/packets/WorldPackets/Receive/SessionEndPacket.cs index 77dd6395..9532d04a 100644 --- a/FFXIVClassic Map Server/packets/WorldPackets/Receive/SessionEndPacket.cs +++ b/FFXIVClassic Map Server/packets/WorldPackets/Receive/SessionEndPacket.cs @@ -1,9 +1,5 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.WorldPackets.Receive { diff --git a/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/CreateLinkshellPacket.cs b/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/CreateLinkshellPacket.cs index 5a64741f..66c4b25a 100644 --- a/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/CreateLinkshellPacket.cs +++ b/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/CreateLinkshellPacket.cs @@ -1,7 +1,6 @@ using FFXIVClassic.Common; using FFXIVClassic_Map_Server.dataobjects; using System; -using System.Collections.Generic; using System.IO; using System.Text; @@ -20,6 +19,7 @@ namespace FFXIVClassic_Map_Server.packets.WorldPackets.Send.Group using (BinaryWriter binWriter = new BinaryWriter(mem)) { binWriter.Write(Encoding.ASCII.GetBytes(name), 0, Encoding.ASCII.GetByteCount(name) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(name)); + binWriter.BaseStream.Seek(0x20, SeekOrigin.Begin); binWriter.Write((UInt16)crest); binWriter.Write((UInt32)master); } diff --git a/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/DeleteLinkshellPacket.cs b/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/DeleteLinkshellPacket.cs index d9460354..b2814854 100644 --- a/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/DeleteLinkshellPacket.cs +++ b/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/DeleteLinkshellPacket.cs @@ -1,6 +1,5 @@ using FFXIVClassic.Common; using FFXIVClassic_Map_Server.dataobjects; -using System; using System.IO; using System.Text; diff --git a/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/GroupInviteResultPacket.cs b/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/GroupInviteResultPacket.cs index 02ca4f25..e1b3e8ac 100644 --- a/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/GroupInviteResultPacket.cs +++ b/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/GroupInviteResultPacket.cs @@ -1,11 +1,7 @@ using FFXIVClassic.Common; using FFXIVClassic_Map_Server.dataobjects; using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.WorldPackets.Send.Group { diff --git a/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/LinkshellChangePacket.cs b/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/LinkshellChangePacket.cs index b4e894c8..bbd5985b 100644 --- a/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/LinkshellChangePacket.cs +++ b/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/LinkshellChangePacket.cs @@ -1,8 +1,5 @@ using FFXIVClassic.Common; -using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.dataobjects; -using System; -using System.Collections.Generic; using System.IO; using System.Text; diff --git a/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/LinkshellInviteCancelPacket.cs b/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/LinkshellInviteCancelPacket.cs index 9ad80615..6c6036f1 100644 --- a/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/LinkshellInviteCancelPacket.cs +++ b/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/LinkshellInviteCancelPacket.cs @@ -1,11 +1,5 @@ using FFXIVClassic.Common; using FFXIVClassic_Map_Server.dataobjects; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.WorldPackets.Send.Group { diff --git a/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/LinkshellInvitePacket.cs b/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/LinkshellInvitePacket.cs index fee38aa0..02388c8c 100644 --- a/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/LinkshellInvitePacket.cs +++ b/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/LinkshellInvitePacket.cs @@ -1,11 +1,8 @@ using FFXIVClassic.Common; using FFXIVClassic_Map_Server.dataobjects; using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.WorldPackets.Send.Group { diff --git a/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/LinkshellLeavePacket.cs b/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/LinkshellLeavePacket.cs index b902903f..f6a60bd1 100644 --- a/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/LinkshellLeavePacket.cs +++ b/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/LinkshellLeavePacket.cs @@ -1,8 +1,6 @@ using FFXIVClassic.Common; -using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.dataobjects; using System; -using System.Collections.Generic; using System.IO; using System.Text; diff --git a/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/LinkshellRankChangePacket.cs b/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/LinkshellRankChangePacket.cs index 1791e492..a30d8238 100644 --- a/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/LinkshellRankChangePacket.cs +++ b/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/LinkshellRankChangePacket.cs @@ -1,8 +1,6 @@ using FFXIVClassic.Common; -using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.dataobjects; using System; -using System.Collections.Generic; using System.IO; using System.Text; diff --git a/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/PartyInvitePacket.cs b/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/PartyInvitePacket.cs index de8ccb31..1f8d7b07 100644 --- a/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/PartyInvitePacket.cs +++ b/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/PartyInvitePacket.cs @@ -1,11 +1,8 @@ using FFXIVClassic.Common; using FFXIVClassic_Map_Server.dataobjects; using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.WorldPackets.Send.Group { diff --git a/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/PartyLeavePacket.cs b/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/PartyLeavePacket.cs index 652e83d0..4bc9f132 100644 --- a/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/PartyLeavePacket.cs +++ b/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/PartyLeavePacket.cs @@ -1,10 +1,7 @@ using FFXIVClassic.Common; -using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.dataobjects; using System; -using System.Collections.Generic; using System.IO; -using System.Text; namespace FFXIVClassic_Map_Server.packets.WorldPackets.Send.Group { diff --git a/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/PartyModifyPacket.cs b/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/PartyModifyPacket.cs index 4c58773e..fd7e8828 100644 --- a/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/PartyModifyPacket.cs +++ b/FFXIVClassic Map Server/packets/WorldPackets/Send/Group/PartyModifyPacket.cs @@ -1,8 +1,6 @@ using FFXIVClassic.Common; -using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.dataobjects; using System; -using System.Collections.Generic; using System.IO; using System.Text; diff --git a/FFXIVClassic Map Server/packets/WorldPackets/Send/WorldRequestZoneChangePacket.cs b/FFXIVClassic Map Server/packets/WorldPackets/Send/WorldRequestZoneChangePacket.cs index 197ca935..af9b736a 100644 --- a/FFXIVClassic Map Server/packets/WorldPackets/Send/WorldRequestZoneChangePacket.cs +++ b/FFXIVClassic Map Server/packets/WorldPackets/Send/WorldRequestZoneChangePacket.cs @@ -1,10 +1,6 @@ using FFXIVClassic.Common; using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.WorldPackets.Send { diff --git a/FFXIVClassic Map Server/packets/receive/GroupCreatedPacket.cs b/FFXIVClassic Map Server/packets/receive/GroupCreatedPacket.cs index d4bd436a..620f2bab 100644 --- a/FFXIVClassic Map Server/packets/receive/GroupCreatedPacket.cs +++ b/FFXIVClassic Map Server/packets/receive/GroupCreatedPacket.cs @@ -1,9 +1,6 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.receive { diff --git a/FFXIVClassic Map Server/packets/receive/UpdateItemPackagePacket.cs b/FFXIVClassic Map Server/packets/receive/UpdateItemPackagePacket.cs new file mode 100644 index 00000000..2f863013 --- /dev/null +++ b/FFXIVClassic Map Server/packets/receive/UpdateItemPackagePacket.cs @@ -0,0 +1,29 @@ +using System; +using System.IO; + +namespace FFXIVClassic_Map_Server.packets.receive +{ + class UpdateItemPackagePacket + { + public bool invalidPacket = false; + public uint actorID; + public uint packageId; + + public UpdateItemPackagePacket(byte[] data) + { + using (MemoryStream mem = new MemoryStream(data)) + { + using (BinaryReader binReader = new BinaryReader(mem)) + { + try{ + actorID = binReader.ReadUInt32(); + packageId = binReader.ReadUInt32(); + } + catch (Exception){ + invalidPacket = true; + } + } + } + } + } +} diff --git a/FFXIVClassic Map Server/packets/send/Actor/AddActorPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/AddActorPacket.cs index 33aec37c..8f5352c0 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/AddActorPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/AddActorPacket.cs @@ -1,6 +1,6 @@ using FFXIVClassic.Common; -namespace FFXIVClassic_Map_Server.packets.send.actor +namespace FFXIVClassic_Map_Server.packets.send.actor { class AddActorPacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/DeleteAllActorsPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/DeleteAllActorsPacket.cs index c2234468..3921b0dd 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/DeleteAllActorsPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/DeleteAllActorsPacket.cs @@ -1,6 +1,6 @@ using FFXIVClassic.Common; -namespace FFXIVClassic_Map_Server.packets.send.actor +namespace FFXIVClassic_Map_Server.packets.send.actor { class DeleteAllActorsPacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/PlayAnimationOnActorPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/PlayAnimationOnActorPacket.cs index cd5ed453..182b0107 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/PlayAnimationOnActorPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/PlayAnimationOnActorPacket.cs @@ -1,9 +1,5 @@ using FFXIVClassic.Common; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.send.actor { diff --git a/FFXIVClassic Map Server/packets/send/Actor/PlayBGAnimation.cs b/FFXIVClassic Map Server/packets/send/Actor/PlayBGAnimation.cs index 0e8a4e59..753414d6 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/PlayBGAnimation.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/PlayBGAnimation.cs @@ -2,7 +2,7 @@ using System.IO; using System.Text; -namespace FFXIVClassic_Map_Server.packets.send.actor +namespace FFXIVClassic_Map_Server.packets.send.actor { class PlayBGAnimation { diff --git a/FFXIVClassic Map Server/packets/send/Actor/SetActorPropetyPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/SetActorPropetyPacket.cs index 1d9d1fe0..02cf9a1f 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/SetActorPropetyPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/SetActorPropetyPacket.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Reflection; using System.Text; -namespace FFXIVClassic_Map_Server.packets.send.actor +namespace FFXIVClassic_Map_Server.packets.send.actor { class SetActorPropetyPacket { @@ -110,6 +110,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor { string[] split = name.Split('.'); int arrayIndex = 0; + if (!(split[0].Equals("work") || split[0].Equals("charaWork") || split[0].Equals("playerWork") || split[0].Equals("npcWork") || split[0].Equals("guildleveWork"))) return false; diff --git a/FFXIVClassic Map Server/packets/send/Actor/SetActorStatePacket.cs b/FFXIVClassic Map Server/packets/send/Actor/SetActorStatePacket.cs index 8bab2346..b0a602fe 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/SetActorStatePacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/SetActorStatePacket.cs @@ -1,7 +1,7 @@ using FFXIVClassic.Common; using System; -namespace FFXIVClassic_Map_Server.packets.send.actor +namespace FFXIVClassic_Map_Server.packets.send.actor { class SetActorStatePacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/SetActorStatusAllPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/SetActorStatusAllPacket.cs index 79bbbf90..79d242a7 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/SetActorStatusAllPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/SetActorStatusAllPacket.cs @@ -2,7 +2,7 @@ using System; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor +namespace FFXIVClassic_Map_Server.packets.send.actor { class SetActorStatusAllPacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/SetActorStatusPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/SetActorStatusPacket.cs index 2cdaf82e..669cdca8 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/SetActorStatusPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/SetActorStatusPacket.cs @@ -2,7 +2,7 @@ using System; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor +namespace FFXIVClassic_Map_Server.packets.send.actor { class SetActorStatusPacket { diff --git a/FFXIVClassic Map Server/packets/send/Actor/_0x132Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/_0x132Packet.cs index 0bcd6b15..769d517d 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/_0x132Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/_0x132Packet.cs @@ -3,7 +3,7 @@ using System; using System.IO; using System.Text; -namespace FFXIVClassic_Map_Server.packets.send.actor +namespace FFXIVClassic_Map_Server.packets.send.actor { class _0x132Packet { diff --git a/FFXIVClassic Map Server/packets/send/Actor/battle/BattleAction.cs b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleAction.cs new file mode 100644 index 00000000..71bf867b --- /dev/null +++ b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleAction.cs @@ -0,0 +1,12 @@ +namespace FFXIVClassic_Map_Server.packets.send.actor.battle +{ + class BattleAction + { + public uint targetId; + public ushort amount; + public ushort worldMasterTextId; + public uint effectId; + public byte param; + public byte unknown; + } +} diff --git a/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX10Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX10Packet.cs new file mode 100644 index 00000000..bbca0af1 --- /dev/null +++ b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX10Packet.cs @@ -0,0 +1,59 @@ +using FFXIVClassic.Common; +using System; +using System.IO; + +namespace FFXIVClassic_Map_Server.packets.send.actor.battle +{ + class BattleActionX10Packet + { + public const ushort OPCODE = 0x013A; + public const uint PACKET_SIZE = 0xD8; + + public static SubPacket BuildPacket(uint playerActorID, uint sourceActorId, uint animationId, ushort commandId, BattleAction[] actionList) + { + byte[] data = new byte[PACKET_SIZE - 0x20]; + + using (MemoryStream mem = new MemoryStream(data)) + { + using (BinaryWriter binWriter = new BinaryWriter(mem)) + { + binWriter.Write((UInt32)sourceActorId); + binWriter.Write((UInt32)animationId); + + //Missing... last value is float, string in here as well? + + binWriter.Seek(0x20, SeekOrigin.Begin); + binWriter.Write((UInt32) actionList.Length); //Num actions (always 1 for this) + binWriter.Write((UInt16)commandId); + binWriter.Write((UInt16)810); //? + + binWriter.Seek(0x20, SeekOrigin.Begin); + foreach (BattleAction action in actionList) + binWriter.Write((UInt32)action.targetId); + + binWriter.Seek(0x50, SeekOrigin.Begin); + foreach (BattleAction action in actionList) + binWriter.Write((UInt16)action.amount); + + binWriter.Seek(0x64, SeekOrigin.Begin); + foreach (BattleAction action in actionList) + binWriter.Write((UInt16)action.worldMasterTextId); + + binWriter.Seek(0x78, SeekOrigin.Begin); + foreach (BattleAction action in actionList) + binWriter.Write((UInt32)action.effectId); + + binWriter.Seek(0xA0, SeekOrigin.Begin); + foreach (BattleAction action in actionList) + binWriter.Write((Byte)action.param); + + binWriter.Seek(0xAA, SeekOrigin.Begin); + foreach (BattleAction action in actionList) + binWriter.Write((Byte)action.unknown); + } + } + + return new SubPacket(OPCODE, sourceActorId, data); + } + } +} diff --git a/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX18Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX18Packet.cs new file mode 100644 index 00000000..0983fb6a --- /dev/null +++ b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX18Packet.cs @@ -0,0 +1,59 @@ +using FFXIVClassic.Common; +using System; +using System.IO; + +namespace FFXIVClassic_Map_Server.packets.send.actor.battle +{ + class BattleActionX18Packet + { + public const ushort OPCODE = 0x013B; + public const uint PACKET_SIZE = 0x148; + + public static SubPacket BuildPacket(uint playerActorID, uint sourceActorId, uint animationId, ushort commandId, BattleAction[] actionList) + { + byte[] data = new byte[PACKET_SIZE - 0x20]; + + using (MemoryStream mem = new MemoryStream(data)) + { + using (BinaryWriter binWriter = new BinaryWriter(mem)) + { + binWriter.Write((UInt32)sourceActorId); + binWriter.Write((UInt32)animationId); + + //Missing... last value is float, string in here as well? + + binWriter.Seek(0x20, SeekOrigin.Begin); + binWriter.Write((UInt32) actionList.Length); //Num actions (always 1 for this) + binWriter.Write((UInt16)commandId); + binWriter.Write((UInt16)810); //? + + binWriter.Seek(0x58, SeekOrigin.Begin); + foreach (BattleAction action in actionList) + binWriter.Write((UInt32)action.targetId); + + binWriter.Seek(0xA0, SeekOrigin.Begin); + foreach (BattleAction action in actionList) + binWriter.Write((UInt16)action.amount); + + binWriter.Seek(0xC4, SeekOrigin.Begin); + foreach (BattleAction action in actionList) + binWriter.Write((UInt16)action.worldMasterTextId); + + binWriter.Seek(0xE8, SeekOrigin.Begin); + foreach (BattleAction action in actionList) + binWriter.Write((UInt32)action.effectId); + + binWriter.Seek(0x130, SeekOrigin.Begin); + foreach (BattleAction action in actionList) + binWriter.Write((Byte)action.param); + + binWriter.Seek(0x142, SeekOrigin.Begin); + foreach (BattleAction action in actionList) + binWriter.Write((Byte)action.unknown); + } + } + + return new SubPacket(OPCODE, sourceActorId, data); + } + } +} diff --git a/FFXIVClassic Map Server/packets/send/Actor/battle/CommandResultX00Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/battle/CommandResultX00Packet.cs index 06cbe136..fc1a2436 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/battle/CommandResultX00Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/battle/CommandResultX00Packet.cs @@ -2,7 +2,7 @@ using System; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor.battle +namespace FFXIVClassic_Map_Server.packets.send.actor.battle { class CommandResultX00Packet { diff --git a/FFXIVClassic Map Server/packets/send/Actor/events/SetEmoteEventCondition.cs b/FFXIVClassic Map Server/packets/send/Actor/events/SetEmoteEventCondition.cs index 688fbcf1..98582ef0 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/events/SetEmoteEventCondition.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/events/SetEmoteEventCondition.cs @@ -4,7 +4,7 @@ using System; using System.IO; using System.Text; -namespace FFXIVClassic_Map_Server.packets.send.actor.events +namespace FFXIVClassic_Map_Server.packets.send.actor.events { class SetEmoteEventCondition { diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryBeginChangePacket.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryBeginChangePacket.cs index 6f423d78..1601fe33 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryBeginChangePacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryBeginChangePacket.cs @@ -7,16 +7,13 @@ namespace FFXIVClassic_Map_Server.packets.send.actor.inventory public const ushort OPCODE = 0x016D; public const uint PACKET_SIZE = 0x28; - public static SubPacket BuildPacket(uint sourceActorId, uint targetActorId) + public static SubPacket BuildPacket(uint playerActorID, bool clearItemPackage = false) { byte[] data = new byte[8]; - data[0] = 2; - return new SubPacket(OPCODE, sourceActorId, data); - } - public static SubPacket BuildPacket(uint playerActorID) - { - byte[] data = new byte[8]; + if (clearItemPackage) + data[0] = 2; + return new SubPacket(OPCODE, playerActorID, data); } } diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryRemoveX08Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryRemoveX08Packet.cs index 270d749f..df87fc59 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryRemoveX08Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/InventoryRemoveX08Packet.cs @@ -3,7 +3,7 @@ using System; using System.Collections.Generic; using System.IO; -namespace FFXIVClassic_Map_Server.packets.send.actor.inventory +namespace FFXIVClassic_Map_Server.packets.send.actor.inventory { class InventoryRemoveX08Packet { diff --git a/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs b/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs index fe0a2d19..7fc79d64 100644 --- a/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs +++ b/FFXIVClassic Map Server/packets/send/events/KickEventPacket.cs @@ -13,7 +13,7 @@ namespace FFXIVClassic_Map_Server.packets.send.events public const ushort OPCODE = 0x012F; public const uint PACKET_SIZE = 0x90; - public static SubPacket BuildPacket(uint sourcePlayerActorId, uint targetEventActorId, string conditionName, List luaParams) + public static SubPacket BuildPacket(uint sourcePlayerActorId, uint targetEventActorId, uint unknown, string conditionName, List luaParams) { byte[] data = new byte[PACKET_SIZE - 0x20]; @@ -23,10 +23,7 @@ namespace FFXIVClassic_Map_Server.packets.send.events { binWriter.Write((UInt32)sourcePlayerActorId); binWriter.Write((UInt32)targetEventActorId); - - int test = 0x75dc1705; //This will crash if set to 0 on pushCommand but not for mining which has to be 0???? - - binWriter.Write((UInt32)test); + binWriter.Write((UInt32)unknown); binWriter.Write((UInt32)0x30400000); binWriter.Write(Encoding.ASCII.GetBytes(conditionName), 0, Encoding.ASCII.GetByteCount(conditionName) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(conditionName)); diff --git a/FFXIVClassic Map Server/packets/send/groups/ContentMembersX08Packet.cs b/FFXIVClassic Map Server/packets/send/groups/ContentMembersX08Packet.cs index 8bc05ab5..6933179f 100644 --- a/FFXIVClassic Map Server/packets/send/groups/ContentMembersX08Packet.cs +++ b/FFXIVClassic Map Server/packets/send/groups/ContentMembersX08Packet.cs @@ -2,9 +2,6 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.send.group { diff --git a/FFXIVClassic Map Server/packets/send/groups/ContentMembersX16Packet.cs b/FFXIVClassic Map Server/packets/send/groups/ContentMembersX16Packet.cs index d263d6d4..645241fb 100644 --- a/FFXIVClassic Map Server/packets/send/groups/ContentMembersX16Packet.cs +++ b/FFXIVClassic Map Server/packets/send/groups/ContentMembersX16Packet.cs @@ -2,9 +2,6 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.send.group { diff --git a/FFXIVClassic Map Server/packets/send/groups/ContentMembersX32Packet.cs b/FFXIVClassic Map Server/packets/send/groups/ContentMembersX32Packet.cs index 363d96c4..4b70c7d4 100644 --- a/FFXIVClassic Map Server/packets/send/groups/ContentMembersX32Packet.cs +++ b/FFXIVClassic Map Server/packets/send/groups/ContentMembersX32Packet.cs @@ -2,9 +2,6 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.send.group { diff --git a/FFXIVClassic Map Server/packets/send/groups/ContentMembersX64Packet.cs b/FFXIVClassic Map Server/packets/send/groups/ContentMembersX64Packet.cs index 88d73a06..d81c05e9 100644 --- a/FFXIVClassic Map Server/packets/send/groups/ContentMembersX64Packet.cs +++ b/FFXIVClassic Map Server/packets/send/groups/ContentMembersX64Packet.cs @@ -2,9 +2,6 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.send.group { diff --git a/FFXIVClassic Map Server/packets/send/groups/CreateNamedGroup.cs b/FFXIVClassic Map Server/packets/send/groups/CreateNamedGroup.cs index 2274ae95..934aa187 100644 --- a/FFXIVClassic Map Server/packets/send/groups/CreateNamedGroup.cs +++ b/FFXIVClassic Map Server/packets/send/groups/CreateNamedGroup.cs @@ -1,12 +1,8 @@ using FFXIVClassic.Common; using FFXIVClassic_Map_Server.actors.group; -using FFXIVClassic_Map_Server.dataobjects; using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.send.group { diff --git a/FFXIVClassic Map Server/packets/send/groups/CreateNamedGroupMultiple.cs b/FFXIVClassic Map Server/packets/send/groups/CreateNamedGroupMultiple.cs index f6905c97..382a241a 100644 --- a/FFXIVClassic Map Server/packets/send/groups/CreateNamedGroupMultiple.cs +++ b/FFXIVClassic Map Server/packets/send/groups/CreateNamedGroupMultiple.cs @@ -1,12 +1,8 @@ using FFXIVClassic.Common; using FFXIVClassic_Map_Server.actors.group; -using FFXIVClassic_Map_Server.dataobjects; using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.send.group { diff --git a/FFXIVClassic Map Server/packets/send/groups/DeleteGroupPacket.cs b/FFXIVClassic Map Server/packets/send/groups/DeleteGroupPacket.cs index 571cd879..9e69d11d 100644 --- a/FFXIVClassic Map Server/packets/send/groups/DeleteGroupPacket.cs +++ b/FFXIVClassic Map Server/packets/send/groups/DeleteGroupPacket.cs @@ -1,11 +1,7 @@ using FFXIVClassic.Common; using FFXIVClassic_Map_Server.actors.group; using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.send.groups { diff --git a/FFXIVClassic Map Server/packets/send/groups/GroupHeaderPacket.cs b/FFXIVClassic Map Server/packets/send/groups/GroupHeaderPacket.cs index 6cb222b2..3a679c63 100644 --- a/FFXIVClassic Map Server/packets/send/groups/GroupHeaderPacket.cs +++ b/FFXIVClassic Map Server/packets/send/groups/GroupHeaderPacket.cs @@ -1,12 +1,8 @@ using FFXIVClassic.Common; using FFXIVClassic_Map_Server.actors.group; -using FFXIVClassic_Map_Server.dataobjects; using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.send.group { diff --git a/FFXIVClassic Map Server/packets/send/groups/GroupMember.cs b/FFXIVClassic Map Server/packets/send/groups/GroupMember.cs index 819d47ea..318c2060 100644 --- a/FFXIVClassic Map Server/packets/send/groups/GroupMember.cs +++ b/FFXIVClassic Map Server/packets/send/groups/GroupMember.cs @@ -1,6 +1,4 @@ -using FFXIVClassic.Common; - -namespace FFXIVClassic_Map_Server.packets.send.group +namespace FFXIVClassic_Map_Server.packets.send.group { class GroupMember { diff --git a/FFXIVClassic Map Server/packets/send/groups/GroupMembersBeginPacket.cs b/FFXIVClassic Map Server/packets/send/groups/GroupMembersBeginPacket.cs index 5b24aa4d..561bbcc4 100644 --- a/FFXIVClassic Map Server/packets/send/groups/GroupMembersBeginPacket.cs +++ b/FFXIVClassic Map Server/packets/send/groups/GroupMembersBeginPacket.cs @@ -1,12 +1,7 @@ using FFXIVClassic.Common; using FFXIVClassic_Map_Server.actors.group; -using FFXIVClassic_Map_Server.dataobjects; using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.send.group { diff --git a/FFXIVClassic Map Server/packets/send/groups/GroupMembersEndPacket.cs b/FFXIVClassic Map Server/packets/send/groups/GroupMembersEndPacket.cs index 9bba4e06..8d044419 100644 --- a/FFXIVClassic Map Server/packets/send/groups/GroupMembersEndPacket.cs +++ b/FFXIVClassic Map Server/packets/send/groups/GroupMembersEndPacket.cs @@ -1,12 +1,7 @@ using FFXIVClassic.Common; using FFXIVClassic_Map_Server.actors.group; -using FFXIVClassic_Map_Server.dataobjects; using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.send.group { diff --git a/FFXIVClassic Map Server/packets/send/groups/GroupMembersX08Packet.cs b/FFXIVClassic Map Server/packets/send/groups/GroupMembersX08Packet.cs index cca76aaf..24842c5a 100644 --- a/FFXIVClassic Map Server/packets/send/groups/GroupMembersX08Packet.cs +++ b/FFXIVClassic Map Server/packets/send/groups/GroupMembersX08Packet.cs @@ -2,9 +2,7 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.send.group { diff --git a/FFXIVClassic Map Server/packets/send/groups/GroupMembersX16Packet.cs b/FFXIVClassic Map Server/packets/send/groups/GroupMembersX16Packet.cs index b4ba775b..c75648ac 100644 --- a/FFXIVClassic Map Server/packets/send/groups/GroupMembersX16Packet.cs +++ b/FFXIVClassic Map Server/packets/send/groups/GroupMembersX16Packet.cs @@ -2,9 +2,7 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.send.group { diff --git a/FFXIVClassic Map Server/packets/send/groups/GroupMembersX32Packet.cs b/FFXIVClassic Map Server/packets/send/groups/GroupMembersX32Packet.cs index 7abee729..e4d4cb74 100644 --- a/FFXIVClassic Map Server/packets/send/groups/GroupMembersX32Packet.cs +++ b/FFXIVClassic Map Server/packets/send/groups/GroupMembersX32Packet.cs @@ -2,9 +2,7 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.send.group { diff --git a/FFXIVClassic Map Server/packets/send/groups/GroupMembersX64Packet.cs b/FFXIVClassic Map Server/packets/send/groups/GroupMembersX64Packet.cs index 44d98851..b77bdf75 100644 --- a/FFXIVClassic Map Server/packets/send/groups/GroupMembersX64Packet.cs +++ b/FFXIVClassic Map Server/packets/send/groups/GroupMembersX64Packet.cs @@ -2,9 +2,7 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.send.group { diff --git a/FFXIVClassic Map Server/packets/send/groups/SynchGroupWorkValuesPacket.cs b/FFXIVClassic Map Server/packets/send/groups/SynchGroupWorkValuesPacket.cs index f33202ef..bad80e9f 100644 --- a/FFXIVClassic Map Server/packets/send/groups/SynchGroupWorkValuesPacket.cs +++ b/FFXIVClassic Map Server/packets/send/groups/SynchGroupWorkValuesPacket.cs @@ -1,12 +1,10 @@ using FFXIVClassic.Common; using FFXIVClassic_Map_Server.actors.group; using System; -using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.packets.send.groups { diff --git a/FFXIVClassic Map Server/packets/send/search/ItemSearchResult.cs b/FFXIVClassic Map Server/packets/send/search/ItemSearchResult.cs index 7d9c51d1..50a44fd8 100644 --- a/FFXIVClassic Map Server/packets/send/search/ItemSearchResult.cs +++ b/FFXIVClassic Map Server/packets/send/search/ItemSearchResult.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FFXIVClassic_Map_Server.packets.send.search +namespace FFXIVClassic_Map_Server.packets.send.search { class ItemSearchResult { diff --git a/FFXIVClassic Map Server/packets/send/search/ItemSearchResultsBeginPacket.cs b/FFXIVClassic Map Server/packets/send/search/ItemSearchResultsBeginPacket.cs index 42fc4f51..e9d2f405 100644 --- a/FFXIVClassic Map Server/packets/send/search/ItemSearchResultsBeginPacket.cs +++ b/FFXIVClassic Map Server/packets/send/search/ItemSearchResultsBeginPacket.cs @@ -1,6 +1,4 @@ -using System.IO; -using System.Text; - + using FFXIVClassic.Common; namespace FFXIVClassic_Map_Server.packets.send.search diff --git a/FFXIVClassic Map Server/packets/send/search/ItemSearchResultsBodyPacket.cs b/FFXIVClassic Map Server/packets/send/search/ItemSearchResultsBodyPacket.cs index 54df84a8..0ba7f712 100644 --- a/FFXIVClassic Map Server/packets/send/search/ItemSearchResultsBodyPacket.cs +++ b/FFXIVClassic Map Server/packets/send/search/ItemSearchResultsBodyPacket.cs @@ -1,5 +1,4 @@ using System.IO; -using System.Text; using System; using FFXIVClassic.Common; using System.Collections.Generic; diff --git a/FFXIVClassic Map Server/packets/send/search/ItemSearchResultsEndPacket.cs b/FFXIVClassic Map Server/packets/send/search/ItemSearchResultsEndPacket.cs index 8eedcb3f..01fd575b 100644 --- a/FFXIVClassic Map Server/packets/send/search/ItemSearchResultsEndPacket.cs +++ b/FFXIVClassic Map Server/packets/send/search/ItemSearchResultsEndPacket.cs @@ -1,6 +1,4 @@ -using System.IO; -using System.Text; - + using FFXIVClassic.Common; namespace FFXIVClassic_Map_Server.packets.send.search diff --git a/FFXIVClassic World Server/Actor/Group/Work/ContentWork.cs b/FFXIVClassic World Server/Actor/Group/Work/ContentWork.cs index 6e7c3941..d60dd63c 100644 --- a/FFXIVClassic World Server/Actor/Group/Work/ContentWork.cs +++ b/FFXIVClassic World Server/Actor/Group/Work/ContentWork.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FFXIVClassic_World_Server.Actor.Group.Work +namespace FFXIVClassic_World_Server.Actor.Group.Work { class ContentWork { diff --git a/FFXIVClassic World Server/Actor/Group/Work/GroupGlobalSave.cs b/FFXIVClassic World Server/Actor/Group/Work/GroupGlobalSave.cs index 3a2ff84d..e84a9ee4 100644 --- a/FFXIVClassic World Server/Actor/Group/Work/GroupGlobalSave.cs +++ b/FFXIVClassic World Server/Actor/Group/Work/GroupGlobalSave.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FFXIVClassic_World_Server.Actor.Group.Work +namespace FFXIVClassic_World_Server.Actor.Group.Work { class GroupGlobalSave { diff --git a/FFXIVClassic World Server/Actor/Group/Work/GroupGlobalTemp.cs b/FFXIVClassic World Server/Actor/Group/Work/GroupGlobalTemp.cs index f8ab5051..7a9111ca 100644 --- a/FFXIVClassic World Server/Actor/Group/Work/GroupGlobalTemp.cs +++ b/FFXIVClassic World Server/Actor/Group/Work/GroupGlobalTemp.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FFXIVClassic_World_Server.Actor.Group.Work +namespace FFXIVClassic_World_Server.Actor.Group.Work { class GroupGlobalTemp { diff --git a/FFXIVClassic World Server/Actor/Group/Work/GroupMemberSave.cs b/FFXIVClassic World Server/Actor/Group/Work/GroupMemberSave.cs index f72fa714..01159a9c 100644 --- a/FFXIVClassic World Server/Actor/Group/Work/GroupMemberSave.cs +++ b/FFXIVClassic World Server/Actor/Group/Work/GroupMemberSave.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FFXIVClassic_World_Server.Actor.Group.Work +namespace FFXIVClassic_World_Server.Actor.Group.Work { class GroupMemberSave { diff --git a/FFXIVClassic World Server/Actor/Group/Work/LinkshellWork.cs b/FFXIVClassic World Server/Actor/Group/Work/LinkshellWork.cs index 9d58eb4e..5312e451 100644 --- a/FFXIVClassic World Server/Actor/Group/Work/LinkshellWork.cs +++ b/FFXIVClassic World Server/Actor/Group/Work/LinkshellWork.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FFXIVClassic_World_Server.Actor.Group.Work +namespace FFXIVClassic_World_Server.Actor.Group.Work { class LinkshellWork { diff --git a/FFXIVClassic World Server/Actor/Group/Work/PartyWork.cs b/FFXIVClassic World Server/Actor/Group/Work/PartyWork.cs index f8bcb97a..967793ed 100644 --- a/FFXIVClassic World Server/Actor/Group/Work/PartyWork.cs +++ b/FFXIVClassic World Server/Actor/Group/Work/PartyWork.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FFXIVClassic_World_Server.Actor.Group.Work +namespace FFXIVClassic_World_Server.Actor.Group.Work { class PartyWork { diff --git a/FFXIVClassic World Server/Actor/Group/Work/RelationWork.cs b/FFXIVClassic World Server/Actor/Group/Work/RelationWork.cs index 18eaab6e..9e94b7fb 100644 --- a/FFXIVClassic World Server/Actor/Group/Work/RelationWork.cs +++ b/FFXIVClassic World Server/Actor/Group/Work/RelationWork.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FFXIVClassic_World_Server.Actor.Group.Work +namespace FFXIVClassic_World_Server.Actor.Group.Work { class RelationWork { diff --git a/FFXIVClassic World Server/DataObjects/Group/Group.cs b/FFXIVClassic World Server/DataObjects/Group/Group.cs index c771d1a8..abeb02a9 100644 --- a/FFXIVClassic World Server/DataObjects/Group/Group.cs +++ b/FFXIVClassic World Server/DataObjects/Group/Group.cs @@ -1,6 +1,5 @@ using FFXIVClassic.Common; using FFXIVClassic_World_Server.Packets.Send.Subpackets.Groups; -using System; using System.Collections.Generic; namespace FFXIVClassic_World_Server.DataObjects.Group diff --git a/FFXIVClassic World Server/DataObjects/Group/Linkshell.cs b/FFXIVClassic World Server/DataObjects/Group/Linkshell.cs index a49178dc..7fa11229 100644 --- a/FFXIVClassic World Server/DataObjects/Group/Linkshell.cs +++ b/FFXIVClassic World Server/DataObjects/Group/Linkshell.cs @@ -1,9 +1,6 @@ using FFXIVClassic_World_Server.Actor.Group.Work; using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using FFXIVClassic_World_Server.Packets.Send.Subpackets.Groups; using FFXIVClassic.Common; diff --git a/FFXIVClassic World Server/DataObjects/Group/LinkshellMember.cs b/FFXIVClassic World Server/DataObjects/Group/LinkshellMember.cs index 21faf8f4..0942e9e4 100644 --- a/FFXIVClassic World Server/DataObjects/Group/LinkshellMember.cs +++ b/FFXIVClassic World Server/DataObjects/Group/LinkshellMember.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.DataObjects.Group { diff --git a/FFXIVClassic World Server/DataObjects/Group/Party.cs b/FFXIVClassic World Server/DataObjects/Group/Party.cs index da7e4ea4..3e8b87a8 100644 --- a/FFXIVClassic World Server/DataObjects/Group/Party.cs +++ b/FFXIVClassic World Server/DataObjects/Group/Party.cs @@ -3,9 +3,6 @@ using FFXIVClassic_World_Server.Actor.Group.Work; using FFXIVClassic_World_Server.Packets.Send.Subpackets.Groups; using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.DataObjects.Group { diff --git a/FFXIVClassic World Server/DataObjects/Group/Relation.cs b/FFXIVClassic World Server/DataObjects/Group/Relation.cs index f38727c3..5ca5fb5f 100644 --- a/FFXIVClassic World Server/DataObjects/Group/Relation.cs +++ b/FFXIVClassic World Server/DataObjects/Group/Relation.cs @@ -1,11 +1,7 @@ using FFXIVClassic.Common; using FFXIVClassic_World_Server.Actor.Group.Work; using FFXIVClassic_World_Server.Packets.Send.Subpackets.Groups; -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.DataObjects.Group { diff --git a/FFXIVClassic World Server/DataObjects/Group/RetainerGroup.cs b/FFXIVClassic World Server/DataObjects/Group/RetainerGroup.cs index bfe5c69f..57729666 100644 --- a/FFXIVClassic World Server/DataObjects/Group/RetainerGroup.cs +++ b/FFXIVClassic World Server/DataObjects/Group/RetainerGroup.cs @@ -3,9 +3,6 @@ using FFXIVClassic_World_Server.Actor.Group.Work; using FFXIVClassic_World_Server.Packets.Send.Subpackets.Groups; using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.DataObjects.Group { diff --git a/FFXIVClassic World Server/DataObjects/Group/RetainerGroupMember.cs b/FFXIVClassic World Server/DataObjects/Group/RetainerGroupMember.cs index acd5e535..e30d32d4 100644 --- a/FFXIVClassic World Server/DataObjects/Group/RetainerGroupMember.cs +++ b/FFXIVClassic World Server/DataObjects/Group/RetainerGroupMember.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FFXIVClassic_World_Server.DataObjects.Group +namespace FFXIVClassic_World_Server.DataObjects.Group { class RetainerGroupMember { diff --git a/FFXIVClassic World Server/DataObjects/Group/RetainerMeetingRelationGroup.cs b/FFXIVClassic World Server/DataObjects/Group/RetainerMeetingRelationGroup.cs index d54afb16..51ce639f 100644 --- a/FFXIVClassic World Server/DataObjects/Group/RetainerMeetingRelationGroup.cs +++ b/FFXIVClassic World Server/DataObjects/Group/RetainerMeetingRelationGroup.cs @@ -1,11 +1,5 @@ using FFXIVClassic.Common; -using FFXIVClassic_World_Server.Actor.Group.Work; using FFXIVClassic_World_Server.Packets.Send.Subpackets.Groups; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.DataObjects.Group { diff --git a/FFXIVClassic World Server/DataObjects/ZoneServer.cs b/FFXIVClassic World Server/DataObjects/ZoneServer.cs index da665001..2ee408ac 100644 --- a/FFXIVClassic World Server/DataObjects/ZoneServer.cs +++ b/FFXIVClassic World Server/DataObjects/ZoneServer.cs @@ -1,10 +1,7 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Net; using System.Net.Sockets; -using System.Text; -using System.Threading.Tasks; using FFXIVClassic.Common; using FFXIVClassic_World_Server.Packets.WorldPackets.Send; diff --git a/FFXIVClassic World Server/Database.cs b/FFXIVClassic World Server/Database.cs index 36c7df4b..5f595adf 100644 --- a/FFXIVClassic World Server/Database.cs +++ b/FFXIVClassic World Server/Database.cs @@ -529,5 +529,35 @@ namespace FFXIVClassic_World_Server } return success; } + + public static bool LinkshellIsBannedName(string name) + { + return false; + } + + public static bool LinkshellExists(string name) + { + bool hasLS = false; + using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD))) + { + try + { + conn.Open(); + MySqlCommand cmd = new MySqlCommand("SELECT * FROM server_linkshells WHERE name = @lsName", conn); + cmd.Parameters.AddWithValue("@lsName", name); + object result = cmd.ExecuteScalar(); + hasLS = result != null && ((uint)result > 0); + } + catch (MySqlException e) + { + Program.Log.Error(e.ToString()); + } + finally + { + conn.Dispose(); + } + } + return hasLS; + } } } diff --git a/FFXIVClassic World Server/FFXIVClassic World Server.csproj b/FFXIVClassic World Server/FFXIVClassic World Server.csproj index affed8c5..5e0c5bcf 100644 --- a/FFXIVClassic World Server/FFXIVClassic World Server.csproj +++ b/FFXIVClassic World Server/FFXIVClassic World Server.csproj @@ -158,6 +158,7 @@ + diff --git a/FFXIVClassic World Server/LinkshellManager.cs b/FFXIVClassic World Server/LinkshellManager.cs index e6423c11..6fe08acd 100644 --- a/FFXIVClassic World Server/LinkshellManager.cs +++ b/FFXIVClassic World Server/LinkshellManager.cs @@ -1,9 +1,6 @@ using FFXIVClassic_World_Server.DataObjects.Group; using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server { @@ -23,8 +20,22 @@ namespace FFXIVClassic_World_Server mCurrentWorldGroupsReference = worldGroupList; } + //Checks if the LS name is in use or banned + public int CanCreateLinkshell(string name) + { + bool nameBanned = Database.LinkshellIsBannedName(name); + bool alreadyExists = Database.LinkshellExists(name); + + if (nameBanned) + return 2; + if (alreadyExists) + return 1; + else + return 0; + } + //Creates a new linkshell and adds it to the list - public ulong CreateLinkshell(string name, ushort crest, uint master) + public Linkshell CreateLinkshell(string name, ushort crest, uint master) { lock (mGroupLockReference) { @@ -32,18 +43,19 @@ namespace FFXIVClassic_World_Server if (resultId >= 0) { Linkshell newLs = new Linkshell(resultId, mWorldManager.GetGroupIndex(), name, crest, master, 0xa); + + mLinkshellList.Add(mWorldManager.GetGroupIndex(), newLs); + mNameToIdLookup.Add(newLs.name, newLs.groupIndex); + mLSIdToIdLookup.Add(newLs.dbId, newLs); + mCurrentWorldGroupsReference.Add(mWorldManager.GetGroupIndex(), newLs); + mWorldManager.IncrementGroupIndex(); //Add founder to the LS - if (AddMemberToLinkshell(master, newLs.name)) - { - mLinkshellList.Add(mWorldManager.GetGroupIndex(), newLs); - mNameToIdLookup.Add(newLs.name, newLs.groupIndex); - mLSIdToIdLookup.Add(newLs.dbId, newLs); - mCurrentWorldGroupsReference.Add(mWorldManager.GetGroupIndex(), newLs); - mWorldManager.IncrementGroupIndex(); - } + AddMemberToLinkshell(master, newLs.name); + + return newLs; } - return resultId; + return null; } } diff --git a/FFXIVClassic World Server/PacketProcessor.cs b/FFXIVClassic World Server/PacketProcessor.cs index abf41fd6..56909658 100644 --- a/FFXIVClassic World Server/PacketProcessor.cs +++ b/FFXIVClassic World Server/PacketProcessor.cs @@ -7,10 +7,7 @@ using FFXIVClassic_World_Server.Packets.Send; using FFXIVClassic_World_Server.Packets.Send.Login; using FFXIVClassic_World_Server.Packets.Send.Subpackets; using FFXIVClassic_World_Server.Packets.WorldPackets.Receive; -using FFXIVClassic_World_Server.Packets.WorldPackets.Send; -using System; using System.Collections.Generic; -using System.IO; namespace FFXIVClassic_World_Server { diff --git a/FFXIVClassic World Server/Packets/Receive/HelloPacket.cs b/FFXIVClassic World Server/Packets/Receive/HelloPacket.cs index 6f2992e5..fff1ce9c 100644 --- a/FFXIVClassic World Server/Packets/Receive/HelloPacket.cs +++ b/FFXIVClassic World Server/Packets/Receive/HelloPacket.cs @@ -1,9 +1,6 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.Packets.Receive { diff --git a/FFXIVClassic World Server/Packets/Receive/Subpackets/GroupCreatedPacket.cs b/FFXIVClassic World Server/Packets/Receive/Subpackets/GroupCreatedPacket.cs index f7135041..df553177 100644 --- a/FFXIVClassic World Server/Packets/Receive/Subpackets/GroupCreatedPacket.cs +++ b/FFXIVClassic World Server/Packets/Receive/Subpackets/GroupCreatedPacket.cs @@ -1,9 +1,6 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.Packets.Receive.Subpackets { diff --git a/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/CreateNamedGroup.cs b/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/CreateNamedGroup.cs index 9081283d..133578da 100644 --- a/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/CreateNamedGroup.cs +++ b/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/CreateNamedGroup.cs @@ -1,12 +1,8 @@ using FFXIVClassic.Common; -using FFXIVClassic_World_Server.Actor.Group; using FFXIVClassic_World_Server.DataObjects.Group; using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.Packets.Send.Subpackets.Groups { diff --git a/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/CreateNamedGroupMultiple.cs b/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/CreateNamedGroupMultiple.cs index 98d9ad13..1c0bb36d 100644 --- a/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/CreateNamedGroupMultiple.cs +++ b/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/CreateNamedGroupMultiple.cs @@ -1,12 +1,8 @@ using FFXIVClassic.Common; -using FFXIVClassic_World_Server.Actor.Group; using FFXIVClassic_World_Server.DataObjects.Group; using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.Packets.Send.Subpackets.Groups { diff --git a/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/DeleteGroupPacket.cs b/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/DeleteGroupPacket.cs index d661ae52..100cbb46 100644 --- a/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/DeleteGroupPacket.cs +++ b/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/DeleteGroupPacket.cs @@ -1,12 +1,7 @@ using FFXIVClassic.Common; -using FFXIVClassic_World_Server.Actor.Group; using FFXIVClassic_World_Server.DataObjects.Group; using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.Packets.Send.Subpackets.Groups { diff --git a/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupHeaderPacket.cs b/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupHeaderPacket.cs index c28fe084..a87874a9 100644 --- a/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupHeaderPacket.cs +++ b/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupHeaderPacket.cs @@ -1,11 +1,8 @@ using FFXIVClassic.Common; using FFXIVClassic_World_Server.DataObjects.Group; using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.Packets.Send.Subpackets.Groups { diff --git a/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMember.cs b/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMember.cs index 8c6b8944..b9885080 100644 --- a/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMember.cs +++ b/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMember.cs @@ -1,6 +1,4 @@ -using FFXIVClassic.Common; - -namespace FFXIVClassic_World_Server.Packets.Send.Subpackets.Groups +namespace FFXIVClassic_World_Server.Packets.Send.Subpackets.Groups { class GroupMember { diff --git a/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMembersBeginPacket.cs b/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMembersBeginPacket.cs index 46f15905..6774a152 100644 --- a/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMembersBeginPacket.cs +++ b/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMembersBeginPacket.cs @@ -1,14 +1,10 @@ using FFXIVClassic.Common; using FFXIVClassic_World_Server.DataObjects.Group; using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.Packets.Send.Subpackets.Groups -{ +{ class GroupMembersBeginPacket { public const ushort OPCODE = 0x017D; diff --git a/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMembersEndPacket.cs b/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMembersEndPacket.cs index 3d095b8b..4ce56683 100644 --- a/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMembersEndPacket.cs +++ b/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMembersEndPacket.cs @@ -1,15 +1,10 @@ using FFXIVClassic.Common; -using FFXIVClassic_World_Server.Actor.Group; using FFXIVClassic_World_Server.DataObjects.Group; using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.Packets.Send.Subpackets.Groups -{ +{ class GroupMembersEndPacket { public const ushort OPCODE = 0x017E; diff --git a/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMembersX08Packet.cs b/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMembersX08Packet.cs index 734e843c..01634103 100644 --- a/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMembersX08Packet.cs +++ b/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMembersX08Packet.cs @@ -2,9 +2,7 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.Packets.Send.Subpackets.Groups { diff --git a/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMembersX16Packet.cs b/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMembersX16Packet.cs index f3181570..6f1a8d55 100644 --- a/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMembersX16Packet.cs +++ b/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMembersX16Packet.cs @@ -2,9 +2,7 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.Packets.Send.Subpackets.Groups { diff --git a/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMembersX32Packet.cs b/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMembersX32Packet.cs index f6669f08..01521604 100644 --- a/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMembersX32Packet.cs +++ b/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMembersX32Packet.cs @@ -2,9 +2,7 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.Packets.Send.Subpackets.Groups { diff --git a/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMembersX64Packet.cs b/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMembersX64Packet.cs index 5a18d0cd..e3cb902c 100644 --- a/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMembersX64Packet.cs +++ b/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/GroupMembersX64Packet.cs @@ -2,9 +2,7 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.Packets.Send.Subpackets.Groups { diff --git a/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/SetActiveLinkshellPacket.cs b/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/SetActiveLinkshellPacket.cs index d387a029..31146cde 100644 --- a/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/SetActiveLinkshellPacket.cs +++ b/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/SetActiveLinkshellPacket.cs @@ -1,11 +1,7 @@ using FFXIVClassic.Common; using FFXIVClassic_World_Server.DataObjects.Group; using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.Packets.Send.Subpackets.Groups { diff --git a/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/SynchGroupWorkValuesPacket.cs b/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/SynchGroupWorkValuesPacket.cs index 57f100cf..831993fc 100644 --- a/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/SynchGroupWorkValuesPacket.cs +++ b/FFXIVClassic World Server/Packets/Send/Subpackets/Groups/SynchGroupWorkValuesPacket.cs @@ -1,13 +1,10 @@ using FFXIVClassic.Common; -using FFXIVClassic_World_Server.Actor.Group; using FFXIVClassic_World_Server.DataObjects.Group; using System; -using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.Packets.Send.Subpackets.Groups { diff --git a/FFXIVClassic World Server/Packets/Send/_0x2Packet.cs b/FFXIVClassic World Server/Packets/Send/_0x2Packet.cs index 1fc6ef98..ba91a5a2 100644 --- a/FFXIVClassic World Server/Packets/Send/_0x2Packet.cs +++ b/FFXIVClassic World Server/Packets/Send/_0x2Packet.cs @@ -1,10 +1,6 @@ using FFXIVClassic.Common; using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.Packets.Send { diff --git a/FFXIVClassic World Server/Packets/Send/_0x7Packet.cs b/FFXIVClassic World Server/Packets/Send/_0x7Packet.cs index f7d6d452..1463543f 100644 --- a/FFXIVClassic World Server/Packets/Send/_0x7Packet.cs +++ b/FFXIVClassic World Server/Packets/Send/_0x7Packet.cs @@ -1,10 +1,6 @@ using FFXIVClassic.Common; using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.Packets.Send { diff --git a/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/CreateLinkshellPacket.cs b/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/CreateLinkshellPacket.cs index aa952d1a..f8ca2669 100644 --- a/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/CreateLinkshellPacket.cs +++ b/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/CreateLinkshellPacket.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.IO; using System.Text; diff --git a/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/CreateRelationPacket.cs b/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/CreateRelationPacket.cs index eb573b5b..80f86099 100644 --- a/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/CreateRelationPacket.cs +++ b/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/CreateRelationPacket.cs @@ -1,7 +1,5 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Text; namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive.Group { diff --git a/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/GroupInviteResultPacket.cs b/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/GroupInviteResultPacket.cs index 6197b16c..d0ec1b60 100644 --- a/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/GroupInviteResultPacket.cs +++ b/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/GroupInviteResultPacket.cs @@ -1,7 +1,5 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Text; namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive.Group { diff --git a/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/LinkshellChangePacket.cs b/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/LinkshellChangePacket.cs index 99b8bd7f..1ac77f3d 100644 --- a/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/LinkshellChangePacket.cs +++ b/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/LinkshellChangePacket.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.IO; using System.Text; diff --git a/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/LinkshellInviteCancelPacket.cs b/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/LinkshellInviteCancelPacket.cs index 0f2bf8f7..045f6b72 100644 --- a/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/LinkshellInviteCancelPacket.cs +++ b/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/LinkshellInviteCancelPacket.cs @@ -1,7 +1,5 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Text; namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive.Group { diff --git a/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/LinkshellInvitePacket.cs b/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/LinkshellInvitePacket.cs index 5f1e86b4..0c7fa1ed 100644 --- a/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/LinkshellInvitePacket.cs +++ b/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/LinkshellInvitePacket.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.IO; using System.Text; diff --git a/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/LinkshellLeavePacket.cs b/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/LinkshellLeavePacket.cs index ea8a5469..7c479d65 100644 --- a/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/LinkshellLeavePacket.cs +++ b/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/LinkshellLeavePacket.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.IO; using System.Text; diff --git a/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/LinkshellRankChangePacket.cs b/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/LinkshellRankChangePacket.cs index 83615df7..c62a4568 100644 --- a/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/LinkshellRankChangePacket.cs +++ b/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/LinkshellRankChangePacket.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.IO; using System.Text; diff --git a/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/PartyInvitePacket.cs b/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/PartyInvitePacket.cs index 1a4d55e3..a0588afd 100644 --- a/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/PartyInvitePacket.cs +++ b/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/PartyInvitePacket.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.IO; using System.Text; diff --git a/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/PartyLeavePacket.cs b/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/PartyLeavePacket.cs index f29cb06e..07826db6 100644 --- a/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/PartyLeavePacket.cs +++ b/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/PartyLeavePacket.cs @@ -1,7 +1,5 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Text; namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive.Group { diff --git a/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/PartyModifyPacket.cs b/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/PartyModifyPacket.cs index 58bffa54..73bfc919 100644 --- a/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/PartyModifyPacket.cs +++ b/FFXIVClassic World Server/Packets/WorldPackets/Receive/Group/PartyModifyPacket.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.IO; using System.Text; diff --git a/FFXIVClassic World Server/Packets/WorldPackets/Receive/SessionBeginConfirmPacket.cs b/FFXIVClassic World Server/Packets/WorldPackets/Receive/SessionBeginConfirmPacket.cs index 189865c6..46201ddf 100644 --- a/FFXIVClassic World Server/Packets/WorldPackets/Receive/SessionBeginConfirmPacket.cs +++ b/FFXIVClassic World Server/Packets/WorldPackets/Receive/SessionBeginConfirmPacket.cs @@ -1,11 +1,5 @@ -using FFXIVClassic.Common; -using FFXIVClassic_World_Server.DataObjects; -using System; -using System.Collections.Generic; +using System; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive { diff --git a/FFXIVClassic World Server/Packets/WorldPackets/Receive/SessionEndConfirmPacket.cs b/FFXIVClassic World Server/Packets/WorldPackets/Receive/SessionEndConfirmPacket.cs index b0e22aec..91f2573b 100644 --- a/FFXIVClassic World Server/Packets/WorldPackets/Receive/SessionEndConfirmPacket.cs +++ b/FFXIVClassic World Server/Packets/WorldPackets/Receive/SessionEndConfirmPacket.cs @@ -1,11 +1,5 @@ -using FFXIVClassic.Common; -using FFXIVClassic_World_Server.DataObjects; -using System; -using System.Collections.Generic; +using System; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive { diff --git a/FFXIVClassic World Server/Packets/WorldPackets/Receive/WorldRequestZoneChangePacket.cs b/FFXIVClassic World Server/Packets/WorldPackets/Receive/WorldRequestZoneChangePacket.cs index faa2e4b4..95720e6f 100644 --- a/FFXIVClassic World Server/Packets/WorldPackets/Receive/WorldRequestZoneChangePacket.cs +++ b/FFXIVClassic World Server/Packets/WorldPackets/Receive/WorldRequestZoneChangePacket.cs @@ -1,11 +1,5 @@ -using FFXIVClassic.Common; -using FFXIVClassic_World_Server.DataObjects; -using System; -using System.Collections.Generic; +using System; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive { diff --git a/FFXIVClassic World Server/Packets/WorldPackets/Send/ErrorPacket.cs b/FFXIVClassic World Server/Packets/WorldPackets/Send/ErrorPacket.cs index c17ae48f..c096552b 100644 --- a/FFXIVClassic World Server/Packets/WorldPackets/Send/ErrorPacket.cs +++ b/FFXIVClassic World Server/Packets/WorldPackets/Send/ErrorPacket.cs @@ -1,11 +1,7 @@ using FFXIVClassic.Common; using FFXIVClassic_World_Server.DataObjects; using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.Packets.WorldPackets.Send { diff --git a/FFXIVClassic World Server/Packets/WorldPackets/Send/LinkshellResultPacket.cs b/FFXIVClassic World Server/Packets/WorldPackets/Send/LinkshellResultPacket.cs new file mode 100644 index 00000000..3d87b79c --- /dev/null +++ b/FFXIVClassic World Server/Packets/WorldPackets/Send/LinkshellResultPacket.cs @@ -0,0 +1,28 @@ +using FFXIVClassic.Common; +using FFXIVClassic_World_Server.DataObjects; +using System; +using System.IO; + +namespace FFXIVClassic_World_Server.Packets.WorldPackets.Send +{ + class LinkshellResultPacket + { + public const ushort OPCODE = 0x1025; + public const uint PACKET_SIZE = 0x24; + + public static SubPacket BuildPacket(Session session, int result) + { + byte[] data = new byte[PACKET_SIZE - 0x20]; + + using (MemoryStream mem = new MemoryStream(data)) + { + using (BinaryWriter binWriter = new BinaryWriter(mem)) + { + binWriter.Write((Int32)result); + } + } + + return new SubPacket(true, OPCODE, session.sessionId, data); + } + } +} diff --git a/FFXIVClassic World Server/Packets/WorldPackets/Send/SessionBeginPacket.cs b/FFXIVClassic World Server/Packets/WorldPackets/Send/SessionBeginPacket.cs index 6871c6eb..12422d4e 100644 --- a/FFXIVClassic World Server/Packets/WorldPackets/Send/SessionBeginPacket.cs +++ b/FFXIVClassic World Server/Packets/WorldPackets/Send/SessionBeginPacket.cs @@ -1,11 +1,7 @@ using FFXIVClassic.Common; using FFXIVClassic_World_Server.DataObjects; using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.Packets.WorldPackets.Send { diff --git a/FFXIVClassic World Server/Packets/WorldPackets/Send/SessionEndPacket.cs b/FFXIVClassic World Server/Packets/WorldPackets/Send/SessionEndPacket.cs index afe00492..2c6701ab 100644 --- a/FFXIVClassic World Server/Packets/WorldPackets/Send/SessionEndPacket.cs +++ b/FFXIVClassic World Server/Packets/WorldPackets/Send/SessionEndPacket.cs @@ -1,11 +1,7 @@ using FFXIVClassic.Common; using FFXIVClassic_World_Server.DataObjects; using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server.Packets.WorldPackets.Send { diff --git a/FFXIVClassic World Server/Program.cs b/FFXIVClassic World Server/Program.cs index 8dc2aafe..a1c14c19 100644 --- a/FFXIVClassic World Server/Program.cs +++ b/FFXIVClassic World Server/Program.cs @@ -1,13 +1,8 @@ using FFXIVClassic_World_Server.DataObjects; using MySql.Data.MySqlClient; using NLog; -using NLog.Fluent; using System; -using System.Collections.Generic; using System.Diagnostics; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server { diff --git a/FFXIVClassic World Server/Properties/AssemblyInfo.cs b/FFXIVClassic World Server/Properties/AssemblyInfo.cs index 2bb7a8a3..5e84fed1 100644 --- a/FFXIVClassic World Server/Properties/AssemblyInfo.cs +++ b/FFXIVClassic World Server/Properties/AssemblyInfo.cs @@ -1,5 +1,4 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following diff --git a/FFXIVClassic World Server/RetainerGroupManager.cs b/FFXIVClassic World Server/RetainerGroupManager.cs index 5fa14b34..c682df72 100644 --- a/FFXIVClassic World Server/RetainerGroupManager.cs +++ b/FFXIVClassic World Server/RetainerGroupManager.cs @@ -1,9 +1,6 @@ using FFXIVClassic_World_Server.DataObjects.Group; using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server { diff --git a/FFXIVClassic World Server/Server.cs b/FFXIVClassic World Server/Server.cs index 1dddb069..20b53159 100644 --- a/FFXIVClassic World Server/Server.cs +++ b/FFXIVClassic World Server/Server.cs @@ -1,10 +1,9 @@ using FFXIVClassic.Common; using FFXIVClassic_World_Server.DataObjects; using FFXIVClassic_World_Server.DataObjects.Group; -using FFXIVClassic_World_Server.Packets.Receive.Subpackets; -using FFXIVClassic_World_Server.Packets.Send.Subpackets.Groups; using FFXIVClassic_World_Server.Packets.WorldPackets.Receive; using FFXIVClassic_World_Server.Packets.WorldPackets.Receive.Group; +using FFXIVClassic_World_Server.Packets.WorldPackets.Send; using System; using System.Collections.Generic; using System.Net; @@ -283,7 +282,22 @@ namespace FFXIVClassic_World_Server //Linkshell create request case 0x1025: CreateLinkshellPacket createLinkshellPacket = new CreateLinkshellPacket(subpacket.data); - mWorldManager.GetLinkshellManager().CreateLinkshell(createLinkshellPacket.name, createLinkshellPacket.crestid, createLinkshellPacket.master); + + Linkshell newLs = null; + int lsError = mWorldManager.GetLinkshellManager().CanCreateLinkshell(createLinkshellPacket.name); + + if (lsError == 0) + { + newLs = mWorldManager.GetLinkshellManager().CreateLinkshell(createLinkshellPacket.name, createLinkshellPacket.crestid, createLinkshellPacket.master); + + if (newLs != null) + newLs.SendGroupPackets(session); + else + lsError = 3; + } + + SubPacket resultPacket = LinkshellResultPacket.BuildPacket(session, lsError); + zoneServer.SendPacket(resultPacket); break; //Linkshell modify request case 0x1026: diff --git a/FFXIVClassic World Server/WorldMaster.cs b/FFXIVClassic World Server/WorldMaster.cs index 53a1a3d9..4bfcc35f 100644 --- a/FFXIVClassic World Server/WorldMaster.cs +++ b/FFXIVClassic World Server/WorldMaster.cs @@ -8,11 +8,6 @@ using FFXIVClassic_World_Server.Packets.WorldPackets.Send.Group; using MySql.Data.MySqlClient; using System; using System.Collections.Generic; -using System.Linq; -using System.Net; -using System.Net.Sockets; -using System.Text; -using System.Threading.Tasks; namespace FFXIVClassic_World_Server { diff --git a/Launcher Editor/Program.cs b/Launcher Editor/Program.cs index 53794df6..766aaac4 100644 --- a/Launcher Editor/Program.cs +++ b/Launcher Editor/Program.cs @@ -1,9 +1,6 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace Launcher_Editor { diff --git a/Launcher Editor/Properties/AssemblyInfo.cs b/Launcher Editor/Properties/AssemblyInfo.cs index bed36e48..3f32537b 100644 --- a/Launcher Editor/Properties/AssemblyInfo.cs +++ b/Launcher Editor/Properties/AssemblyInfo.cs @@ -1,5 +1,4 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following diff --git a/data/scripts/base/chara/npc/object/MarketEntrance.lua b/data/scripts/base/chara/npc/object/MarketEntrance.lua index aa858698..5c0269b6 100644 --- a/data/scripts/base/chara/npc/object/MarketEntrance.lua +++ b/data/scripts/base/chara/npc/object/MarketEntrance.lua @@ -11,6 +11,8 @@ eventPushStepPrvMarket(?, ?, ?) - require ("global") +local MARKETWARD_ENTRANCE = {-201.0, 0.0, -160.0, 1.5}; + function init(npc) return false, false, 0, 0; end diff --git a/data/scripts/base/chara/npc/populace/PopulaceLinkshellManager.lua b/data/scripts/base/chara/npc/populace/PopulaceLinkshellManager.lua index 094772c7..1a01e526 100644 --- a/data/scripts/base/chara/npc/populace/PopulaceLinkshellManager.lua +++ b/data/scripts/base/chara/npc/populace/PopulaceLinkshellManager.lua @@ -10,6 +10,12 @@ eventTalkStepMakeupDone() - Confirm when creating LS eventTalkStepModifyDone() - Confirm when modding LS eventTalkStepBreakDone() - Confirm when deleting LS +Text IDs: + +25121 - That [@SWITCH($E8(1),linkshell,company)] name is already being used. +25122 - That [@SWITCH($E8(1),linkshell,company)] name cannot be used. +25123 - The [@SWITCH($E8(1),linkshell,company)] “[@STRING($EA(2))]” has been [@SWITCH($E8(1),created,founded)]. + --]] require ("global") @@ -18,44 +24,49 @@ function init(npc) return false, false, 0, 0; end -function createLinkshell(name, crest) +function createLinkshell(player, name, crest) + GetWorldManager():RequestWorldLinkshellCreate(player, name, crest); + return waitForSignal("ls_result"); +end + +function modifyLinkshell(player, name, crest) end -function modifyLinkshell(name, crest) - -end - -function disbandLinkshell(name, crest) +function disbandLinkshell(player, name, crest) end function onEventStarted(player, npc, triggerName) - hasNoActiveLS = false; + local hasNoActiveLS = false; callClientFunction(player, "eventTalkStep1", hasNoActiveLS); - command, lsName, crestId = callClientFunction(player, "eventTalkStep2", hasNoActiveLS); + local command, lsName, crestId = callClientFunction(player, "eventTalkStep2", hasNoActiveLS); --Create - if (result == 3) then - - player:SendMessage(0x20, "", "" .. tostring(lsName)); - player:SendMessage(0x20, "", "" .. tostring(crestId)); - player:SendMessage(0x20, "", "" .. tostring(command)); - - createLinkshell(lsName, crestId); - callClientFunction(player, "eventTalkStepMakeupDone"); + if (command == 3) then + local result = createLinkshell(player, lsName, crestId); + if (result == 0) then + callClientFunction(player, "eventTalkStepMakeupDone"); + elseif (result == 1) then + player:SendGameMessage(player, GetWorldMaster(), 25121, 0x20); --LS already exists + callClientFunction(player, "eventTalkStepBreakDone"); + elseif (result == 2) then + player:SendGameMessage(player, GetWorldMaster(), 25122, 0x20); --Cannot use this name (reserved/banned) + callClientFunction(player, "eventTalkStepBreakDone"); + elseif (result == 3) then + end --Modify - elseif (result == 4) then - modifyLinkshell(lsName, crestId); + elseif (command == 4) then + modifyLinkshell(player, lsName, crestId); callClientFunction(player, "eventTalkStepModifyDone"); --Disband - elseif (result == 5) then - disbandLinkshell(lsName, crestId); + elseif (command == 5) then + disbandLinkshell(player, lsName, crestId); callClientFunction(player, "eventTalkStepBreakDone"); end - + player:endEvent(); end \ No newline at end of file diff --git a/data/scripts/base/chara/npc/retainer/OrdinaryRetainer.lua b/data/scripts/base/chara/npc/retainer/OrdinaryRetainer.lua index 2131a414..69f13f70 100644 --- a/data/scripts/base/chara/npc/retainer/OrdinaryRetainer.lua +++ b/data/scripts/base/chara/npc/retainer/OrdinaryRetainer.lua @@ -24,10 +24,6 @@ function init(npc) return false, false, 0, 0; end -function onSpawn(player, npc) - npc:SendFullRetainerInventory(player); -end - function onEventStarted(player, retainer, triggerName) while (true) do diff --git a/data/scripts/commands/BazaarCheckCommand.lua b/data/scripts/commands/BazaarCheckCommand.lua new file mode 100644 index 00000000..87b63e84 --- /dev/null +++ b/data/scripts/commands/BazaarCheckCommand.lua @@ -0,0 +1,29 @@ +--[[ + +BazaarCheckCommand Script + +Handles what happens when you examine a player's bazaar + +--]] + +require ("global") + +function onEventStarted(player, actor, triggerName, name, arg1, arg2, arg3, bazaarActorId) + + local bazaarActor = nil; + + if (name ~= nil) then + bazaarActor = player:GetZone():FindPCInZone(name); + elseif (bazaarActorId ~= nil) then + bazaarActor = player:GetZone():FindActorInArea(bazaarActorId); + end + + if (bazaarActor ~= nil) then + callClientFunction(player, "delegateCommand", GetStaticActor("BazaarCheckCommand"), "processChackBazaar"); + else + --Show error + end + + player:EndEvent(); + +end \ No newline at end of file diff --git a/data/scripts/commands/BazaarDealCommand.lua b/data/scripts/commands/BazaarDealCommand.lua new file mode 100644 index 00000000..17edb358 --- /dev/null +++ b/data/scripts/commands/BazaarDealCommand.lua @@ -0,0 +1,71 @@ +--[[ + +BazaarDealCommand Script + +Handles various bazaar transfer options + +All bazaar args have a Reward (The item the person who fufills the request gets) and a Seek (The item the player wants, either gil or an item). + +--]] + +function onEventStarted(player, actor, triggerName, rewardItem, seekItem, bazaarMode, arg1, bazaarActor, rewardAmount, seekAmount, arg2, arg3, type9ItemIds) + + local originalReward = nil; + local originalSeek = nil; + + --Handle special case for offers + if (seekItem == nil) then + originalSeek = player:GetItemPackage(0):GetItemAtSlot(rewardItem.seekSlot); + originalReward = player:GetItemPackage(0):GetItemAtSlot(rewardItem.offerSlot); + end + + --Handle Reward + if (type(rewardItem) == "number") then + rewardItem = GetWorldManager():CreateItem(rewardItem, rewardAmount); + player:RemoveItem(1000001, rewardAmount); + elseif (seekItem == nil) then + rewardItem = originalReward; + if (bazaarMode ~= 11) then + rewardItem = GetWorldManager():CreateItem(rewardItem.itemId, rewardAmount, rewardItem.quality, rewardItem.modifiers); + end + else + rewardItem = player:GetItem(rewardItem); + originalReward = rewardItem; + if (bazaarMode ~= 11) then + rewardItem = GetWorldManager():CreateItem(rewardItem.itemId, rewardAmount, rewardItem.quality, rewardItem.modifiers); + end + end + + --Handle Seek + if (type(seekItem) == "number") then + seekItem = GetWorldManager():CreateItem(seekItem, seekAmount); + elseif (seekItem == nil) then + seekItem = originalSeek; + if (bazaarMode ~= 11) then + seekItem = GetWorldManager():CreateItem(seekItem.itemId, seekAmount, seekItem.quality, seekItem.modifiers); + end + else + seekItem = player:GetItem(seekItem); + originalSeek = seekItem; + if (bazaarMode ~= 11) then + seekItem = GetWorldManager():CreateItem(seekItem.itemId, seekAmount, seekItem.quality, seekItem.modifiers); + end + end + + --If not selling, remove the seek item + if (bazaarMode ~= 11 and bazaarMode ~= 12 and bazaarMode ~= 13) then + if (originalSeek ~= nil) then + player:RemoveItem(originalSeek, seekAmount); + end + end + + --Remove the reward item + if (originalReward ~= nil) then + player:RemoveItem(originalReward, rewardAmount); + end + + GetWorldManager():AddToBazaar(player, rewardItem, seekItem, rewardAmount, seekAmount, bazaarMode); + + player:EndEvent(); + +end \ No newline at end of file diff --git a/data/scripts/commands/BazaarTradeCommand.lua b/data/scripts/commands/BazaarTradeCommand.lua new file mode 100644 index 00000000..dbd3cf82 --- /dev/null +++ b/data/scripts/commands/BazaarTradeCommand.lua @@ -0,0 +1,53 @@ +--[[ + +BazaarTradeCommand Script + +Handles bazaar trade + +All bazaar args have a Reward (The item the person who fufills the request gets) and a Seek (The item the player wants, either gil or an item). + +--]] + +function onEventStarted(player, actor, triggerName, rewardItem, seekItemOrCost, seekAmount, arg1, bazaarActorId, rewardAmount, rewardItemId, nameIndex, arg2, type9ItemIds) + + local originalReward = nil; + local originalSeek = nil; + local bazaarActor = nil; + + --Get the bazaar actor + if (bazaarActorId ~= nil) then + bazaarActor = player:GetZone():FindActorInArea(bazaarActorId); + end + + --Abort if no actor + if (bazaarActor == nil) then + player:SendGameMessage(player, worldMaster, 25111, 0x20); + player:EndEvent(); + return; + end + + --If seekItem is a number, we are buying an item (ExecuteBazaarBuy) + if (type(seekItemOrCost) == "number") then + if (player:GetCurrentGil() >= seekItemOrCost) then + if (GetWorldManager():BazaarBuyOperation(bazaarActor, player, bazaarActor:GetItem(rewardItem), rewardAmount, seekItemOrCost)) then + else + player:SendGameMessage(player, worldMaster, 25111, 0x20); + end + else + player:SendGameMessage(player, worldMaster, 40252, 0x20); + end + else --Else we are fufilling a sought out item (ExecuteBazaarSell) + local rewardItem = bazaarActor:GetItem(rewardItem); + local seekItem = player:GetItem(seekItemOrCost); + if (rewardItem ~= nil and seekItem ~= nil) then + if (GetWorldManager():BazaarSellOperation(bazaarActor, player, rewardItem, rewardAmount, seekItem, seekAmount)) then + else + player:SendGameMessage(player, worldMaster, 25111, 0x20); + end + else + end + end + + player:EndEvent(); + +end \ No newline at end of file diff --git a/data/scripts/commands/BazaarUndealCommand.lua b/data/scripts/commands/BazaarUndealCommand.lua new file mode 100644 index 00000000..a42a82dd --- /dev/null +++ b/data/scripts/commands/BazaarUndealCommand.lua @@ -0,0 +1,22 @@ +--[[ + +BazaarUndealCommand Script + +Handles canceling bazaar items + +25107 - Your bazaar is either full or already contains that unique item. +25111 - Unable to complete transaction. +25112 - You are unable to remove the item from your bazaar. You cannot hold any more items. +25113 - Offered and sought items cannot be identical. +25114 - Items in less than mint condition cannot be offered. +25115 - Items in less than mint condition cannot be placed in your bazaar. + +--]] + +function onEventStarted(player, actor, triggerName, rewardItem, arg1, bazaarType, arg2, bazaarActor, rewardAmount, seekAmount, arg3, arg4, type9ItemIds) + + GetWorldManager():RemoveFromBazaar(player, player:GetItem(rewardItem)); + + player:EndEvent(); + +end \ No newline at end of file diff --git a/data/scripts/commands/ConfirmTradeCommand.lua b/data/scripts/commands/ConfirmTradeCommand.lua new file mode 100644 index 00000000..109f783c --- /dev/null +++ b/data/scripts/commands/ConfirmTradeCommand.lua @@ -0,0 +1,20 @@ +--[[ + +ConfirmTradeCommand Script + +Handles what happens when you accept/refuse a trade + +--]] + +function onEventStarted(player, actor, triggerName, groupType, result) + + --Accept + if (result == 1) then + GetWorldManager():AcceptTrade(player); + --Refuse + elseif (result == 2) then + GetWorldManager():RefuseTrade(player); + end + player:EndEvent(); + +end \ No newline at end of file diff --git a/data/scripts/commands/EquipCommand.lua b/data/scripts/commands/EquipCommand.lua index 0713d1f2..82b5e385 100644 --- a/data/scripts/commands/EquipCommand.lua +++ b/data/scripts/commands/EquipCommand.lua @@ -58,7 +58,7 @@ function onEventStarted(player, actor, triggerName, invActionInfo, param1, param --Equip Item if (invActionInfo ~= nil) then - item = player:GetInventory(0):GetItemAtSlot(invActionInfo.slot); + item = player:GetItemPackage(0):GetItemAtSlot(invActionInfo.slot); equipItem(player, equipSlot, item); player:SendAppearance(); --Unequip Item diff --git a/data/scripts/commands/ItemMovePackageCommand.lua b/data/scripts/commands/ItemMovePackageCommand.lua new file mode 100644 index 00000000..5f1bd6c4 --- /dev/null +++ b/data/scripts/commands/ItemMovePackageCommand.lua @@ -0,0 +1,13 @@ +--[[ + +ItemMovePackageCommand Script + +Handles moving items across item packages (IE: Taking loot) + +--]] + +function onEventStarted(player, actor, triggerName, itemReference, targetPackage, sourcePackage, arg1, arg2, unknown, arg3, arg4, arg5, type9ItemIds) + + player:EndEvent(); + +end \ No newline at end of file diff --git a/data/scripts/commands/ItemTransferCommand.lua b/data/scripts/commands/ItemTransferCommand.lua new file mode 100644 index 00000000..392c54f9 --- /dev/null +++ b/data/scripts/commands/ItemTransferCommand.lua @@ -0,0 +1,13 @@ +--[[ + +ItemTransferCommand Script + +Handles giving an item to another party member. + +--]] + +function onEventStarted(player, actor, triggerName, itemReference, targetPackage, sourcePackage, arg1, targetPlayer, arg2, arg3, arg4, arg5, type9ItemIds) + + player:EndEvent(); + +end \ No newline at end of file diff --git a/data/scripts/commands/ItemWasteCommand.lua b/data/scripts/commands/ItemWasteCommand.lua index c906675b..a5ff9cd2 100644 --- a/data/scripts/commands/ItemWasteCommand.lua +++ b/data/scripts/commands/ItemWasteCommand.lua @@ -9,7 +9,7 @@ The param "itemDBIds" has the vars: item1 and item2. --]] -function onEventStarted(player, actor, triggerName, invActionInfo, param1, param2, param3, param4, param5, param6, param7, param8, itemDBIds) - player:GetInventory(0x00):RemoveItemAtSlot(invActionInfo.slot); +function onEventStarted(player, actor, triggerName, itemReference, targetPackage, sourcePackage, arg1, arg2, unknown, arg3, arg4, arg5, type9ItemIds) + player:GetItemPackage(itemReference.itemPackage):RemoveItemAtSlot(itemReference.slot); player:EndEvent(); end diff --git a/data/scripts/commands/TradeExecuteCommand.lua b/data/scripts/commands/TradeExecuteCommand.lua new file mode 100644 index 00000000..730f491f --- /dev/null +++ b/data/scripts/commands/TradeExecuteCommand.lua @@ -0,0 +1,95 @@ +--[[ + +TradeExecuteCommand Script + +Handles all trading between players + +Functions: + +processTradeCommandOpenTray() - Opens the trade widget. +processTradeCommandCloseTray() - Closes the trade widget. +processTradeCommandReply(command, params) - Operates the trade widget. +processUpdateTradeCommandTrayData() - ? + +Commands: + +set: TradeWidget resets "Set Mode" (turned on once item selected while waiting for reply). +back: TradeWidget resets "Choose Mode" (turned on when ui operation is done). +fix: You have accepted the deal. +targetfix: Target has accepted the deal. +doedit: You have canceled your accept. +reedit: Target has canceled their accept. + +--]] + +require ("global") + +function onEventStarted(player, actor, triggerName) + + callClientFunction(player, "delegateCommand", GetStaticActor("TradeExecuteCommand"), "processTradeCommandOpenTray"); + + tradeOffering = player:GetTradeOfferings(); + + while (true) do + widgetOpen, chosenOperation, tradeSlot, type7, quantity, packageId, quality = callClientFunction(player, "delegateCommand", GetStaticActor("TradeExecuteCommand"), "processUpdateTradeCommandTrayData"); + + --Abort script if client script dead + if (widgetOpen == false or widgetOpen == nil) then + break; + end + + --Handle you/target canceling/finishing the trade + if (not player:IsTrading() or not player:GetOtherTrader():IsTrading()) then + break; + end + + --Handle target accepting + if (player:GetOtherTrader():IsTradeAccepted() == true) then + callClientFunction(player, "delegateCommand", GetStaticActor("TradeExecuteCommand"), "processTradeCommandReply", "targetfix"); + else + callClientFunction(player, "delegateCommand", GetStaticActor("TradeExecuteCommand"), "processTradeCommandReply", "reedit"); + end + + --Check if both accepted the trade + if (player:IsTradeAccepted() and player:GetOtherTrader():IsTradeAccepted()) then + callClientFunction(player, "delegateCommand", GetStaticActor("TradeExecuteCommand"), "processTradeCommandCloseTray"); + GetWorldManager():SwapTradedItems(player, player:GetOtherTrader()); + break; + end + + --Clear Item + if (chosenOperation == 1) then + player:RemoveTradeItem(tradeSlot - 1); + callClientFunction(player, "delegateCommand", GetStaticActor("TradeExecuteCommand"), "processTradeCommandReply", "set"); + --Clear All + elseif (chosenOperation == 2) then + player:ClearTradeItems(1); + callClientFunction(player, "delegateCommand", GetStaticActor("TradeExecuteCommand"), "processTradeCommandReply", "set"); + --Item Chosen + elseif (chosenOperation == 3) then + player:AddTradeItem(tradeSlot - 1, type7.slot, quantity); + callClientFunction(player, "delegateCommand", GetStaticActor("TradeExecuteCommand"), "processTradeCommandReply", "set", 2, 2, 2, 2); + --Gil Chosen + elseif (chosenOperation == 4) then + player:AddTradeGil(quantity); + callClientFunction(player, "delegateCommand", GetStaticActor("TradeExecuteCommand"), "processTradeCommandReply", "set"); + --Cancel + elseif (chosenOperation == 11) then + player:FinishTradeTransaction(); + break; + --OK + elseif (chosenOperation == 12) then + callClientFunction(player, "delegateCommand", GetStaticActor("TradeExecuteCommand"), "processTradeCommandReply", "fix"); + player:AcceptTrade(true); + --Reedit + elseif (chosenOperation == 13) then + callClientFunction(player, "delegateCommand", GetStaticActor("TradeExecuteCommand"), "processTradeCommandReply", "doedit"); + player:AcceptTrade(false); + end + + wait(1); + end + + player:EndEvent(); + +end \ No newline at end of file diff --git a/data/scripts/commands/TradeOfferCancelCommand.lua b/data/scripts/commands/TradeOfferCancelCommand.lua new file mode 100644 index 00000000..71edd609 --- /dev/null +++ b/data/scripts/commands/TradeOfferCancelCommand.lua @@ -0,0 +1,14 @@ +--[[ + +TradeOfferCommand Script + +Handles what happens a player cancels a trade + +--]] + +function onEventStarted(player, actor, triggerName, commandId, result) + + GetWorldManager():CancelTrade(player); + player:EndEvent(); + +end \ No newline at end of file diff --git a/data/scripts/commands/TradeOfferCommand.lua b/data/scripts/commands/TradeOfferCommand.lua new file mode 100644 index 00000000..8222d7d8 --- /dev/null +++ b/data/scripts/commands/TradeOfferCommand.lua @@ -0,0 +1,26 @@ +--[[ + +TradeOfferCommand Script + +Handles what happens when you invite to trade + +--]] + +function onEventStarted(player, actor, triggerName, name, arg1, arg2, arg3, actorId) + + local otherActor = nil; + + if (name ~= nil) then + otherActor = player:GetZone():FindPCInZone(name); + elseif (actorId ~= nil) then + otherActor = player:GetZone():FindActorInArea(actorId); + end + + if (otherActor ~= nil) then + GetWorldManager():CreateTradeGroup(player, otherActor); + else + end + + player:EndEvent(); + +end \ No newline at end of file diff --git a/data/scripts/commands/gm/givegil.lua b/data/scripts/commands/gm/givegil.lua index b4d3a9c1..b92d0ab4 100644 --- a/data/scripts/commands/gm/givegil.lua +++ b/data/scripts/commands/gm/givegil.lua @@ -27,7 +27,7 @@ function onTrigger(player, argc, qty, name, lastName) qty = tonumber(qty) or 1; location = INVENTORY_CURRENCY; - local added = player:GetInventory(location):AddItem(currency, qty, 1); + local added = player:GetItemPackage(location):AddItem(currency, qty, 1); local messageID = MESSAGE_TYPE_SYSTEM_ERROR; local message = "unable to add gil"; diff --git a/data/scripts/commands/gm/giveitem.lua b/data/scripts/commands/gm/giveitem.lua index 79d01ff5..5506f724 100644 --- a/data/scripts/commands/gm/giveitem.lua +++ b/data/scripts/commands/gm/giveitem.lua @@ -46,8 +46,7 @@ function onTrigger(player, argc, item, qty, location, name, lastName) location = INVENTORY_NORMAL; end; - - local invCheck = player:getInventory(location):AddItem(item, qty, 1); + local invCheck = player:getItemPackage(location):addItem(item, qty, 1); if (invCheck == INV_ERROR_FULL) then -- Your inventory is full. diff --git a/data/scripts/retainer.lua b/data/scripts/retainer.lua index 7348bd20..e4aa3c8c 100644 --- a/data/scripts/retainer.lua +++ b/data/scripts/retainer.lua @@ -22,18 +22,24 @@ function doItemTrade(player, retainer) callClientFunction(player, "eventTalkRetainerItemTrade", 1); while (true) do - resultCode, type7Param, un1, quantity, itemId, quality = callClientFunction(player, "eventTalkRetainerItemTrade", 2); + resultCode, item, un1, quantity, itemId, quality = callClientFunction(player, "eventTalkRetainerItemTrade", 2); + player:SendMessage(0x20, "", "" .. tostring(resultCode)); + player:SendMessage(0x20, "", "" .. tostring(un1)); + player:SendMessage(0x20, "", "" .. tostring(quantity)); + player:SendMessage(0x20, "", "" .. tostring(itemId)); + player:SendMessage(0x20, "", "" .. tostring(quality)); + --Retreieve if (resultCode == 31) then - retainer:GetInventory(type7Param.inventoryType):RemoveItemAtSlot(type7Param.slot, quantity); - retainer:GetInventory(type7Param.inventoryType):SendUpdatePackets(player, true); - player:GetInventory(type7Param.inventoryType):AddItem(itemId, quantity, quality); + retainer:GetItemPackage(item.itemPackage):RemoveItemAtSlot(item.slot, quantity); + retainer:GetItemPackage(item.itemPackage):SendUpdatePackets(player, true); + player:GetItemPackage(item.itemPackage):AddItem(itemId, quantity, quality); --Entrust elseif (resultCode == 32) then - player:GetInventory(type7Param.inventoryType):RemoveItemAtSlot(type7Param.slot, quantity); - retainer:GetInventory(type7Param.inventoryType):AddItem(itemId, quantity, quality); - retainer:GetInventory(type7Param.inventoryType):SendUpdatePackets(player, true); + player:GetItemPackage(item.itemPackage):RemoveItemAtSlot(item.slot, quantity); + retainer:GetItemPackage(item.itemPackage):AddItem(itemId, quantity, quality); + retainer:GetItemPackage(item.itemPackage):SendUpdatePackets(player, true); end callClientFunction(player, "eventReturnResult", resultCode, false); diff --git a/sql/characters.sql b/sql/characters.sql index 78213547..2bd1102e 100644 --- a/sql/characters.sql +++ b/sql/characters.sql @@ -48,4 +48,4 @@ CREATE TABLE `characters` ( `homepoint` int(10) unsigned NOT NULL DEFAULT '0', `homepointInn` tinyint(3) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=166 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8; diff --git a/sql/characters_inventory.sql b/sql/characters_inventory.sql index 30cc31b2..c7fcb453 100644 --- a/sql/characters_inventory.sql +++ b/sql/characters_inventory.sql @@ -4,7 +4,7 @@ Source Host: localhost Source Database: ffxiv_server Target Host: localhost Target Database: ffxiv_server -Date: 9/9/2017 2:31:15 PM +Date: 12/17/2017 3:37:39 PM */ SET FOREIGN_KEY_CHECKS=0; @@ -12,10 +12,12 @@ SET FOREIGN_KEY_CHECKS=0; -- Table structure for characters_inventory -- ---------------------------- CREATE TABLE `characters_inventory` ( - `id` int(10) unsigned zerofill NOT NULL AUTO_INCREMENT, `characterId` int(10) unsigned NOT NULL, - `inventoryType` smallint(5) unsigned NOT NULL DEFAULT '0', `serverItemId` int(10) unsigned NOT NULL, - `quantity` int(10) unsigned NOT NULL DEFAULT '1', - PRIMARY KEY (`id`,`characterId`) -) ENGINE=InnoDB AUTO_INCREMENT=325 DEFAULT CHARSET=utf8; + `itemPackage` smallint(5) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`characterId`,`serverItemId`,`itemPackage`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records +-- ---------------------------- diff --git a/sql/characters_inventory_bazaar.sql b/sql/characters_inventory_bazaar.sql new file mode 100644 index 00000000..0082b120 --- /dev/null +++ b/sql/characters_inventory_bazaar.sql @@ -0,0 +1,28 @@ +/* +MySQL Data Transfer +Source Host: localhost +Source Database: ffxiv_server +Target Host: localhost +Target Database: ffxiv_server +Date: 12/17/2017 3:37:44 PM +*/ + +SET FOREIGN_KEY_CHECKS=0; +-- ---------------------------- +-- Table structure for characters_inventory_bazaar +-- ---------------------------- +CREATE TABLE `characters_inventory_bazaar` ( + `id` int(10) unsigned zerofill NOT NULL AUTO_INCREMENT, + `characterId` int(10) unsigned NOT NULL DEFAULT '0', + `rewardId` bigint(10) unsigned DEFAULT NULL, + `seekId` bigint(10) unsigned DEFAULT '0', + `rewardAmount` int(11) DEFAULT '0', + `seekAmount` int(11) DEFAULT '0', + `bazaarMode` tinyint(4) unsigned NOT NULL DEFAULT '0', + `sellPrice` int(11) DEFAULT '0', + PRIMARY KEY (`id`,`characterId`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records +-- ---------------------------- diff --git a/sql/characters_inventory_equipment.sql b/sql/characters_inventory_equipment.sql index 8a87e29e..1101b439 100644 --- a/sql/characters_inventory_equipment.sql +++ b/sql/characters_inventory_equipment.sql @@ -1,52 +1,24 @@ --- MySQL dump 10.13 Distrib 5.7.10, for Win64 (x86_64) --- --- Host: localhost Database: ffxiv_database --- ------------------------------------------------------ --- Server version 5.7.10-log +/* +MySQL Data Transfer +Source Host: localhost +Source Database: ffxiv_server +Target Host: localhost +Target Database: ffxiv_server +Date: 12/17/2017 3:37:50 PM +*/ -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - --- --- Table structure for table `characters_inventory_equipment` --- - -DROP TABLE IF EXISTS `characters_inventory_equipment`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `characters_inventory_equipment` ( - `characterId` int(10) unsigned NOT NULL, - `classId` smallint(5) unsigned NOT NULL, - `equipSlot` smallint(5) unsigned NOT NULL, - `itemId` bigint(10) unsigned NOT NULL, - PRIMARY KEY (`characterId`,`classId`,`equipSlot`) +SET FOREIGN_KEY_CHECKS=0; +-- ---------------------------- +-- Table structure for characters_inventory_equipment +-- ---------------------------- +CREATE TABLE `characters_inventory_equipment` ( + `characterId` int(10) unsigned NOT NULL, + `classId` smallint(5) unsigned NOT NULL, + `equipSlot` smallint(5) unsigned NOT NULL, + `itemId` bigint(10) unsigned NOT NULL, + PRIMARY KEY (`characterId`,`classId`,`equipSlot`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; --- --- Dumping data for table `characters_inventory_equipment` --- - -LOCK TABLES `characters_inventory_equipment` WRITE; -/*!40000 ALTER TABLE `characters_inventory_equipment` DISABLE KEYS */; -/*!40000 ALTER TABLE `characters_inventory_equipment` ENABLE KEYS */; -UNLOCK TABLES; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - --- Dump completed on 2016-06-07 22:54:46 +-- ---------------------------- +-- Records +-- ---------------------------- diff --git a/sql/retainers_inventory.sql b/sql/retainers_inventory.sql index 3264da35..15f62160 100644 --- a/sql/retainers_inventory.sql +++ b/sql/retainers_inventory.sql @@ -4,7 +4,7 @@ Source Host: localhost Source Database: ffxiv_server Target Host: localhost Target Database: ffxiv_server -Date: 9/9/2017 2:30:28 PM +Date: 12/17/2017 3:38:25 PM */ SET FOREIGN_KEY_CHECKS=0; @@ -12,10 +12,12 @@ SET FOREIGN_KEY_CHECKS=0; -- Table structure for retainers_inventory -- ---------------------------- CREATE TABLE `retainers_inventory` ( - `id` int(10) unsigned zerofill NOT NULL AUTO_INCREMENT, `retainerId` int(10) unsigned NOT NULL, - `inventoryType` smallint(5) unsigned NOT NULL DEFAULT '0', `serverItemId` int(10) unsigned NOT NULL, - `quantity` int(10) unsigned NOT NULL DEFAULT '1', - PRIMARY KEY (`id`,`retainerId`) -) ENGINE=InnoDB AUTO_INCREMENT=333 DEFAULT CHARSET=utf8; + `itemPackage` mediumint(8) unsigned NOT NULL, + PRIMARY KEY (`retainerId`,`serverItemId`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records +-- ---------------------------- diff --git a/sql/server_items.sql b/sql/server_items.sql index a0cf8694..095b491e 100644 --- a/sql/server_items.sql +++ b/sql/server_items.sql @@ -4,7 +4,7 @@ Source Host: localhost Source Database: ffxiv_server Target Host: localhost Target Database: ffxiv_server -Date: 9/9/2017 2:31:34 PM +Date: 12/17/2017 3:38:35 PM */ SET FOREIGN_KEY_CHECKS=0; @@ -12,16 +12,16 @@ SET FOREIGN_KEY_CHECKS=0; -- Table structure for server_items -- ---------------------------- CREATE TABLE `server_items` ( - `id` int(10) unsigned zerofill NOT NULL AUTO_INCREMENT, + `id` bigint(20) unsigned zerofill NOT NULL AUTO_INCREMENT, `itemId` int(10) unsigned NOT NULL, - `quality` tinyint(3) unsigned NOT NULL DEFAULT '0', - `itemType` tinyint(6) unsigned NOT NULL DEFAULT '0', - `durability` int(11) NOT NULL DEFAULT '0', - `spiritbind` smallint(5) unsigned DEFAULT '0', - `materia1` tinyint(3) unsigned DEFAULT '0', - `materia2` tinyint(3) unsigned DEFAULT '0', - `materia3` tinyint(3) unsigned DEFAULT '0', - `materia4` tinyint(3) unsigned DEFAULT '0', - `materia5` tinyint(3) unsigned DEFAULT '0', + `quantity` int(10) unsigned DEFAULT '1', + `quality` tinyint(3) unsigned DEFAULT '1', + `isExclusive` tinyint(1) unsigned DEFAULT '0', + `isAttached` tinyint(1) unsigned DEFAULT '0', + `isDealing` tinyint(1) unsigned DEFAULT '0', PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=1435 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records +-- ---------------------------- diff --git a/sql/server_items_modifiers.sql b/sql/server_items_modifiers.sql new file mode 100644 index 00000000..49f3b29f --- /dev/null +++ b/sql/server_items_modifiers.sql @@ -0,0 +1,35 @@ +/* +MySQL Data Transfer +Source Host: localhost +Source Database: ffxiv_server +Target Host: localhost +Target Database: ffxiv_server +Date: 12/17/2017 3:38:44 PM +*/ + +SET FOREIGN_KEY_CHECKS=0; +-- ---------------------------- +-- Table structure for server_items_modifiers +-- ---------------------------- +CREATE TABLE `server_items_modifiers` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `durability` int(10) unsigned NOT NULL DEFAULT '0', + `mainQuality` tinyint(3) unsigned NOT NULL DEFAULT '1', + `subQuality1` tinyint(3) unsigned NOT NULL DEFAULT '1', + `subQuality2` tinyint(3) unsigned NOT NULL DEFAULT '1', + `subQuality3` tinyint(3) unsigned NOT NULL DEFAULT '1', + `param1` int(10) unsigned NOT NULL DEFAULT '0', + `param2` int(10) unsigned NOT NULL DEFAULT '0', + `param3` int(10) unsigned NOT NULL DEFAULT '0', + `spiritbind` smallint(5) unsigned NOT NULL DEFAULT '0', + `materia1` smallint(5) unsigned NOT NULL DEFAULT '0', + `materia2` smallint(5) unsigned NOT NULL DEFAULT '0', + `materia3` smallint(5) unsigned NOT NULL DEFAULT '0', + `materia4` smallint(5) unsigned NOT NULL DEFAULT '0', + `materia5` smallint(5) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2315 DEFAULT CHARSET=latin1; + +-- ---------------------------- +-- Records +-- ---------------------------- diff --git a/www/patch/ffxiv/48eca647/metainfo/D2010.09.19.0000.torrent b/www/patch/ffxiv/48eca647/metainfo/D2010.09.19.0000.torrent deleted file mode 100644 index a01c5ef6..00000000 Binary files a/www/patch/ffxiv/48eca647/metainfo/D2010.09.19.0000.torrent and /dev/null differ diff --git a/www/patch/ffxiv/48eca647/metainfo/D2010.09.23.0000.torrent b/www/patch/ffxiv/48eca647/metainfo/D2010.09.23.0000.torrent deleted file mode 100644 index ba51ba5c..00000000 Binary files a/www/patch/ffxiv/48eca647/metainfo/D2010.09.23.0000.torrent and /dev/null differ diff --git a/www/patch/ffxiv/48eca647/metainfo/D2012.05.20.0000.0001.torrent b/www/patch/ffxiv/48eca647/metainfo/D2012.05.20.0000.0001.torrent deleted file mode 100644 index 6cd55e8e..00000000 Binary files a/www/patch/ffxiv/48eca647/metainfo/D2012.05.20.0000.0001.torrent and /dev/null differ diff --git a/www/patch/ffxiv/48eca647/patch/D2010.09.23.0000.patch b/www/patch/ffxiv/48eca647/patch/D2010.09.23.0000.patch deleted file mode 100644 index d28c7adf..00000000 Binary files a/www/patch/ffxiv/48eca647/patch/D2010.09.23.0000.patch and /dev/null differ diff --git a/www/patch/test.php b/www/patch/test.php deleted file mode 100644 index a612015f..00000000 --- a/www/patch/test.php +++ /dev/null @@ -1,3 +0,0 @@ - - -