Advertisement
Kiporralixo

Untitled

Mar 21st, 2017
379
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.75 KB | None | 0 0
  1. using System;
  2. using System.Linq;
  3. using System.Collections.Generic;
  4.  
  5. using Plus.Core;
  6. using Plus.HabboHotel.Items;
  7. using Plus.Communication.Packets.Outgoing.Inventory.Trading;
  8. using Plus.Communication.Packets.Outgoing;
  9. using Plus.Database.Interfaces;
  10.  
  11. namespace Plus.HabboHotel.Rooms.Trading
  12. {
  13.     public class Trade
  14.     {
  15.         private readonly int RoomId;
  16.         public TradeUser[] Users;
  17.  
  18.         private readonly int oneId;
  19.         private readonly int twoId;
  20.         private int TradeStage;
  21.  
  22.         public Trade(int UserOneId, int UserTwoId, int RoomId)
  23.         {
  24.             oneId = UserOneId;
  25.             twoId = UserTwoId;
  26.  
  27.             Users = new TradeUser[2];
  28.             Users[0] = new TradeUser(UserOneId, RoomId);
  29.             Users[1] = new TradeUser(UserTwoId, RoomId);
  30.             TradeStage = 1;
  31.             this.RoomId = RoomId;
  32.  
  33.             foreach (TradeUser User in Users.ToList())
  34.             {
  35.                 if (!User.GetRoomUser().Statusses.ContainsKey("trd"))
  36.                 {
  37.                     User.GetRoomUser().AddStatus("trd", "");
  38.                     User.GetRoomUser().UpdateNeeded = true;
  39.                 }
  40.             }
  41.  
  42.             SendMessageToUsers(new TradingStartComposer(UserOneId, UserTwoId));
  43.         }
  44.  
  45.         public bool AllUsersAccepted
  46.         {
  47.             get
  48.             {
  49.                 for (int i = 0; i < Users.Length; i++)
  50.                 {
  51.                     if (Users[i] == null)
  52.                         continue;
  53.                     if (!Users[i].HasAccepted)
  54.                         return false;
  55.                 }
  56.  
  57.                 return true;
  58.             }
  59.         }
  60.  
  61.         public bool ContainsUser(int Id)
  62.         {
  63.             for (int i = 0; i < Users.Length; i++)
  64.             {
  65.                 if (Users[i] == null)
  66.                     continue;
  67.                 if (Users[i].UserId == Id)
  68.                     return true;
  69.             }
  70.  
  71.             return false;
  72.         }
  73.  
  74.         public TradeUser GetTradeUser(int Id)
  75.         {
  76.             for (int i = 0; i < Users.Length; i++)
  77.             {
  78.                 if (Users[i] == null)
  79.                     continue;
  80.                 if (Users[i].UserId == Id)
  81.                     return Users[i];
  82.             }
  83.  
  84.             return null;
  85.         }
  86.  
  87.         public void OfferItem(int UserId, Item Item)
  88.         {
  89.             TradeUser User = GetTradeUser(UserId);
  90.  
  91.             if (User == null || Item == null || !Item.GetBaseItem().AllowTrade || User.HasAccepted || TradeStage != 1)
  92.             {
  93.                 return;
  94.             }
  95.  
  96.             ClearAccepted();
  97.  
  98.             if (!User.OfferedItems.Contains(Item))
  99.                 User.OfferedItems.Add(Item);
  100.  
  101.             UpdateTradeWindow();
  102.         }
  103.  
  104.         public void TakeBackItem(int UserId, Item Item)
  105.         {
  106.             TradeUser User = GetTradeUser(UserId);
  107.  
  108.             if (User == null || Item == null || User.HasAccepted || TradeStage != 1)
  109.             {
  110.                 return;
  111.             }
  112.  
  113.             ClearAccepted();
  114.  
  115.             User.OfferedItems.Remove(Item);
  116.             UpdateTradeWindow();
  117.         }
  118.  
  119.         public void Accept(int UserId)
  120.         {
  121.             TradeUser User = GetTradeUser(UserId);
  122.  
  123.             if (User == null || TradeStage != 1)
  124.             {
  125.                 return;
  126.             }
  127.  
  128.             User.HasAccepted = true;
  129.  
  130.             SendMessageToUsers(new TradingAcceptComposer(UserId, true));
  131.  
  132.  
  133.             if (AllUsersAccepted)
  134.             {
  135.                 SendMessageToUsers(new TradingCompleteComposer());
  136.                 TradeStage++;
  137.                 ClearAccepted();
  138.             }
  139.         }
  140.  
  141.         public void Unaccept(int UserId)
  142.         {
  143.             TradeUser User = GetTradeUser(UserId);
  144.  
  145.             if (User == null || TradeStage != 1 || AllUsersAccepted)
  146.             {
  147.                 return;
  148.             }
  149.  
  150.             User.HasAccepted = false;
  151.  
  152.             SendMessageToUsers(new TradingAcceptComposer(UserId, false));
  153.         }
  154.  
  155.         public void CompleteTrade(int UserId)
  156.         {
  157.             TradeUser User = GetTradeUser(UserId);
  158.  
  159.             if (User == null || TradeStage != 2)
  160.             {
  161.                 return;
  162.             }
  163.  
  164.             User.HasAccepted = true;
  165.  
  166.             SendMessageToUsers(new TradingConfirmedComposer(UserId, true));
  167.  
  168.             if (AllUsersAccepted)
  169.             {
  170.                 TradeStage = 999;
  171.                 Finnito();
  172.             }
  173.         }
  174.  
  175.         private void Finnito()
  176.         {
  177.             try
  178.             {
  179.                 DeliverItems();
  180.                 CloseTradeClean();
  181.             }
  182.             catch (Exception e)
  183.             {
  184.                 Logging.LogThreadException(e.ToString(), "Trade task");
  185.             }
  186.         }
  187.  
  188.         public void ClearAccepted()
  189.         {
  190.             foreach (TradeUser User in Users.ToList())
  191.             {
  192.                 User.HasAccepted = false;
  193.             }
  194.         }
  195.  
  196.         public void UpdateTradeWindow()
  197.         {
  198.             foreach (TradeUser User in this.Users.ToList())
  199.             {
  200.                 if (User == null)
  201.                     continue;
  202.  
  203.                 SendMessageToUsers(new TradingUpdateComposer(this));
  204.             }
  205.         }
  206.  
  207.         public void DeliverItems()
  208.         {
  209.             // List items
  210.             List<Item> ItemsOne = GetTradeUser(oneId).OfferedItems;
  211.             List<Item> ItemsTwo = GetTradeUser(twoId).OfferedItems;
  212.  
  213.             string User1 = "";
  214.             string User2 = "";
  215.  
  216.             // Verify they are still in user inventory
  217.             foreach (Item I in ItemsOne.ToList())
  218.             {
  219.                 if (I == null)
  220.                     continue;
  221.  
  222.                 if (GetTradeUser(oneId).GetClient().GetHabbo().GetInventoryComponent().GetItem(I.Id) == null)
  223.                 {
  224.                     GetTradeUser(oneId).GetClient().SendNotification(LanguageLocale.GetValue("trade_failed"));
  225.                     GetTradeUser(twoId).GetClient().SendNotification(LanguageLocale.GetValue("trade_failed"));
  226.                     return;
  227.                 }
  228.                 User1 += I.Id + ";";
  229.             }
  230.  
  231.             foreach (Item I in ItemsTwo.ToList())
  232.             {
  233.                 if (I == null)
  234.                     continue;
  235.  
  236.                 if (GetTradeUser(twoId).GetClient().GetHabbo().GetInventoryComponent().GetItem(I.Id) == null)
  237.                 {
  238.                     GetTradeUser(oneId).GetClient().SendNotification(LanguageLocale.GetValue("trade_failed"));
  239.                     GetTradeUser(twoId).GetClient().SendNotification(LanguageLocale.GetValue("trade_failed"));
  240.  
  241.                     return;
  242.                 }
  243.                 User2 += I.Id + ";";
  244.             }
  245.  
  246.  
  247.             // Deliver them
  248.             using (IQueryAdapter dbClient = PlusEnvironment.GetDatabaseManager().GetQueryReactor())
  249.             {
  250.                 foreach (Item I in ItemsOne.ToList())
  251.                 {
  252.                     if (I == null)
  253.                         continue;
  254.  
  255.                     GetTradeUser(oneId).GetClient().GetHabbo().GetInventoryComponent().RemoveItem(I.Id);
  256.  
  257.                     dbClient.SetQuery("UPDATE `items` SET `user_id` = @user WHERE `id` = @id LIMIT 1");
  258.                     dbClient.AddParameter("user", twoId);
  259.                     dbClient.AddParameter("id", I.Id);
  260.                     dbClient.RunQuery();
  261.  
  262.                     GetTradeUser(twoId).GetClient().GetHabbo().GetInventoryComponent().AddNewItem(I.Id, I.BaseItem, I.ExtraData, I.GroupId, false, false, I.LimitedNo, I.LimitedTot);
  263.                 }
  264.  
  265.                 foreach (Item I in ItemsTwo.ToList())
  266.                 {
  267.                     if (I == null)
  268.                         continue;
  269.  
  270.                     GetTradeUser(twoId).GetClient().GetHabbo().GetInventoryComponent().RemoveItem(I.Id);
  271.  
  272.                     dbClient.SetQuery("UPDATE `items` SET `user_id` = @user WHERE `id` = @id LIMIT 1");
  273.                     dbClient.AddParameter("user", oneId);
  274.                     dbClient.AddParameter("id", I.Id);
  275.                     dbClient.RunQuery();
  276.  
  277.                     GetTradeUser(oneId).GetClient().GetHabbo().GetInventoryComponent().AddNewItem(I.Id, I.BaseItem, I.ExtraData, I.GroupId, false, false, I.LimitedNo, I.LimitedTot);
  278.                 }
  279.             }
  280.  
  281.             using (IQueryAdapter dbClient = PlusEnvironment.GetDatabaseManager().GetQueryReactor())
  282.             {
  283.                 dbClient.SetQuery("INSERT INTO `logs_client_trade` VALUES(null, @1id, @2id, @1items, @2items, UNIX_TIMESTAMP())");
  284.                 dbClient.AddParameter("1id", oneId);
  285.                 dbClient.AddParameter("2id", twoId);
  286.                 dbClient.AddParameter("1items", User1);
  287.                 dbClient.AddParameter("2items", User2);
  288.                 dbClient.RunQuery();
  289.             }
  290.  
  291.  
  292.             // Update inventories
  293.             GetTradeUser(oneId).GetClient().GetHabbo().GetInventoryComponent().UpdateItems(false);
  294.             GetTradeUser(twoId).GetClient().GetHabbo().GetInventoryComponent().UpdateItems(false);
  295.         }
  296.  
  297.         public void CloseTradeClean()
  298.         {
  299.             foreach (TradeUser User in this.Users.ToList())
  300.             {
  301.                 if (User == null || User.GetRoomUser() == null)
  302.                     continue;
  303.  
  304.                 if (User.GetRoomUser().Statusses.ContainsKey("trd"))
  305.                 {
  306.                     User.GetRoomUser().RemoveStatus("trd");
  307.                     User.GetRoomUser().UpdateNeeded = true;
  308.                 }
  309.             }
  310.  
  311.             SendMessageToUsers(new TradingFinishComposer());
  312.             GetRoom().ActiveTrades.Remove(this);
  313.         }
  314.  
  315.         public void CloseTrade(int UserId)
  316.         {
  317.             foreach (TradeUser User in this.Users.ToList())
  318.             {
  319.                 if (User == null || User.GetRoomUser() == null)
  320.                     continue;
  321.  
  322.                 if (User.GetRoomUser().Statusses.ContainsKey("trd"))
  323.                 {
  324.                     User.GetRoomUser().RemoveStatus("trd");
  325.                     User.GetRoomUser().UpdateNeeded = true;
  326.                 }
  327.             }
  328.  
  329.             SendMessageToUsers(new TradingClosedComposer(UserId));
  330.         }
  331.  
  332.         public void SendMessageToUsers(ServerPacket Message)
  333.         {
  334.             foreach (TradeUser User in this.Users.ToList())
  335.             {
  336.                 if (User == null || User.GetClient() == null)
  337.                     continue;
  338.  
  339.                 User.GetClient().SendMessage(Message);
  340.             }
  341.         }
  342.  
  343.         private Room GetRoom()
  344.         {
  345.             Room Room;
  346.             if (PlusEnvironment.GetGame().GetRoomManager().TryGetRoom(RoomId, out Room))
  347.                 return Room;
  348.  
  349.             return null;
  350.         }
  351.     }
  352. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement