From 316e326d71a70ad39898bf3cdf112ce30fd34773 Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Sun, 21 Aug 2016 18:16:54 -0400 Subject: [PATCH] GM tickets can now be in an open/closed state. Added some helper functions for currancy, and added functions to allow changing chocobo appearance. --- FFXIVClassic Map Server/Database.cs | 121 +++++++++++++++++- FFXIVClassic Map Server/PacketProcessor.cs | 11 +- .../actors/chara/player/Inventory.cs | 16 ++- .../actors/chara/player/Player.cs | 14 ++ 4 files changed, 152 insertions(+), 10 deletions(-) diff --git a/FFXIVClassic Map Server/Database.cs b/FFXIVClassic Map Server/Database.cs index 1a3b80da..569889dc 100644 --- a/FFXIVClassic Map Server/Database.cs +++ b/FFXIVClassic Map Server/Database.cs @@ -829,7 +829,7 @@ namespace FFXIVClassic_Map_Server { ushort equipSlot = reader.GetUInt16(0); ulong uniqueItemId = reader.GetUInt16(1); - InventoryItem item = player.GetInventory(Inventory.NORMAL).GetItemById(uniqueItemId); + InventoryItem item = player.GetInventory(Inventory.NORMAL).GetItemByUniqueId(uniqueItemId); equipment[equipSlot] = item; } } @@ -1247,10 +1247,11 @@ namespace FFXIVClassic_Map_Server return cheevosPacket.BuildPacket(player.actorId); } - public static void SaveSupportTicket(GMSupportTicketPacket gmTicket) + public static bool SaveSupportTicket(GMSupportTicketPacket gmTicket, string playerName) { string query; MySqlCommand cmd; + bool wasError = 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))) { @@ -1260,11 +1261,12 @@ namespace FFXIVClassic_Map_Server query = @" INSERT INTO supportdesk_tickets - (title, body, langCode) + (name, title, body, langCode) VALUES - (@title, @body, @langCode)"; + (@name, @title, @body, @langCode)"; cmd = new MySqlCommand(query, conn); + cmd.Parameters.AddWithValue("@name", playerName); cmd.Parameters.AddWithValue("@title", gmTicket.ticketTitle); cmd.Parameters.AddWithValue("@body", gmTicket.ticketBody); cmd.Parameters.AddWithValue("@langCode", gmTicket.langCode); @@ -1272,6 +1274,81 @@ namespace FFXIVClassic_Map_Server cmd.ExecuteNonQuery(); } catch (MySqlException e) + { + Program.Log.Error(e.ToString()); + wasError = true; + } + finally + { + conn.Dispose(); + } + } + + return wasError; + } + + public static bool isTicketOpen(string playerName) + { + bool isOpen = 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(); + + string query = @" + SELECT + isOpen + FROM supportdesk_tickets + WHERE name = @name + "; + + MySqlCommand cmd = new MySqlCommand(query, conn); + + cmd.Parameters.AddWithValue("@name", playerName); + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + isOpen = reader.GetBoolean(0); + } + } + } + catch (MySqlException e) + { + Program.Log.Error(e.ToString()); + } + finally + { + conn.Dispose(); + } + } + + return isOpen; + } + + public static void closeTicket(string playerName) + { + bool isOpen = 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(); + + string query = @" + UPDATE + supportdesk_tickets + SET isOpen = 0 + WHERE name = @name + "; + + MySqlCommand cmd = new MySqlCommand(query, conn); + cmd.Parameters.AddWithValue("@name", playerName); + cmd.ExecuteNonQuery(); + } + catch (MySqlException e) { Program.Log.Error(e.ToString()); } @@ -1442,5 +1519,41 @@ namespace FFXIVClassic_Map_Server } } } + + public static void ChangePlayerChocoboAppearance(Player player, byte appearanceId) + { + string query; + MySqlCommand cmd; + + 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 = @" + UPDATE characters_chocobo + SET + chocoboAppearance=@chocoboAppearance + WHERE + characterId = @characterId"; + + cmd = new MySqlCommand(query, conn); + cmd.Parameters.AddWithValue("@characterId", player.actorId); + cmd.Parameters.AddWithValue("@chocoboAppearance", appearanceId); + + cmd.ExecuteNonQuery(); + } + catch (MySqlException e) + { + Program.Log.Error(e.ToString()); + } + finally + { + conn.Dispose(); + } + } + } + } } diff --git a/FFXIVClassic Map Server/PacketProcessor.cs b/FFXIVClassic Map Server/PacketProcessor.cs index b999b639..1c17fb51 100644 --- a/FFXIVClassic Map Server/PacketProcessor.cs +++ b/FFXIVClassic Map Server/PacketProcessor.cs @@ -388,7 +388,7 @@ namespace FFXIVClassic_Map_Server break; //Request if GM ticket exists case 0x01D3: - client.QueuePacket(BasePacket.CreatePacket(StartGMTicketPacket.BuildPacket(player.actorID, false), true, false)); + client.QueuePacket(BasePacket.CreatePacket(StartGMTicketPacket.BuildPacket(player.actorID, Database.isTicketOpen(player.GetActor().customDisplayName)), true, false)); break; //Request for GM response message case 0x01D4: @@ -398,11 +398,16 @@ namespace FFXIVClassic_Map_Server case 0x01D5: GMSupportTicketPacket gmTicket = new GMSupportTicketPacket(subpacket.data); Program.Log.Info("Got GM Ticket: \n" + gmTicket.ticketTitle + "\n" + gmTicket.ticketBody); - Database.SaveSupportTicket(gmTicket); - client.QueuePacket(BasePacket.CreatePacket(GMTicketSentResponsePacket.BuildPacket(player.actorID, true), true, false)); + bool wasError = Database.SaveSupportTicket(gmTicket, player.GetActor().customDisplayName); + client.QueuePacket(BasePacket.CreatePacket(GMTicketSentResponsePacket.BuildPacket(player.actorID, !wasError), true, false)); + + if (!wasError) + client.QueuePacket(BasePacket.CreatePacket(StartGMTicketPacket.BuildPacket(player.actorID, true), true, false)); + break; //Request to end ticket case 0x01D6: + Database.closeTicket(player.GetActor().customDisplayName); client.QueuePacket(BasePacket.CreatePacket(EndGMTicketPacket.BuildPacket(player.actorID), true, false)); break; default: diff --git a/FFXIVClassic Map Server/actors/chara/player/Inventory.cs b/FFXIVClassic Map Server/actors/chara/player/Inventory.cs index 19538ae4..9d317cc8 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Inventory.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Inventory.cs @@ -46,14 +46,24 @@ namespace FFXIVClassic_Map_Server.actors.chara.player return null; } - public InventoryItem GetItemById(ulong itemId) + public InventoryItem GetItemByUniqueId(ulong uniqueItemId) { foreach (InventoryItem item in list) - { - if (item.uniqueId == itemId) + { + if (item.uniqueId == uniqueItemId) return item; } return null; + } + + public InventoryItem GetItemByCatelogId(ulong catelogId) + { + foreach (InventoryItem item in list) + { + if (item.itemId == catelogId) + return item; + } + return null; } public void RefreshItem(InventoryItem item) diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index 4d7f333b..00db9417 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -959,6 +959,14 @@ namespace FFXIVClassic_Map_Server.Actors return null; } + public int GetCurrentGil() + { + if (GetInventory(Inventory.CURRENCY).HasItem(1000001)) + return GetInventory(Inventory.CURRENCY).GetItemByCatelogId(1000001).quantity; + else + return 0; + } + public Actor GetActorInInstance(uint actorId) { foreach (Actor a in playerSession.actorInstanceList) @@ -1270,5 +1278,11 @@ namespace FFXIVClassic_Map_Server.Actors chocoboAppearance = appearanceId; chocoboName = nameResponse; } + + public void ChangeChocoboAppearance(byte appearanceId) + { + Database.ChangePlayerChocoboAppearance(this, appearanceId); + chocoboAppearance = appearanceId; + } } }