/src/Mango/Communication/Packets/Incoming/Room/Engine/PlaceObjectEvent.cs

https://bitbucket.org/TheRealAtho/mango · C# · 219 lines · 178 code · 39 blank · 2 comment · 22 complexity · 614505b0b917a1b3d71c535e08940d2e MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Mango.Communication.Sessions;
  6. using Mango.Rooms;
  7. using Mango.Items;
  8. using Mango.Communication.Packets.Outgoing.Room.Engine;
  9. using Mango.Rooms.Mapping;
  10. using Mango.Communication.Packets.Outgoing.Inventory.Furni;
  11. using Mango.Items.Events;
  12. using MySql.Data.MySqlClient;
  13. namespace Mango.Communication.Packets.Incoming.Room.Engine
  14. {
  15. class PlaceObjectEvent : IPacketEvent
  16. {
  17. public void parse(Session session, ClientPacket packet)
  18. {
  19. RoomInstance instance = session.GetPlayer().GetAvatar().GetCurrentRoom();
  20. if (!session.GetPlayer().GetAvatar().InRoom)
  21. {
  22. return;
  23. }
  24. int ItemId = 0;
  25. string[] Data = null;
  26. string RawData = packet.PopString();
  27. Data = RawData.Split(' ');
  28. if (!int.TryParse(Data[0], out ItemId))
  29. {
  30. return;
  31. }
  32. Item Item = null;
  33. if (!session.GetPlayer().GetInventory().TryGetItem(ItemId, out Item))
  34. {
  35. return;
  36. }
  37. bool HasPlacementRights = instance.GetRights().CheckRights(session.GetPlayer().GetAvatar());
  38. bool IsPlacingGuestSticky = false;
  39. if (Item.Data.Behaviour == ItemBehaviour.STICKY_NOTE && !HasPlacementRights && instance.GetItems().GuestsCanPlaceStickies)
  40. {
  41. IsPlacingGuestSticky = true;
  42. }
  43. else if (!HasPlacementRights)
  44. {
  45. session.SendPacket(new PlaceObjectErrorComposer(ItemPlacementError.INSUFFICIENT_RIGHTS));
  46. return;
  47. }
  48. if (Item.PendingExpiration && Item.ExpireTimeLeft < 0)
  49. {
  50. // to-do: remove item
  51. return;
  52. }
  53. switch (Item.Data.Type)
  54. {
  55. default:
  56. case ItemType.FLOOR:
  57. if (Data.Length < 4)
  58. {
  59. return;
  60. }
  61. int X = 0;
  62. int Y = 0;
  63. int Rotation = 0;
  64. if (!int.TryParse(Data[1], out X)) { return; }
  65. if (!int.TryParse(Data[2], out Y)) { return; }
  66. if (!int.TryParse(Data[3], out Rotation)) { return; }
  67. Vector3D NewPosition = null;
  68. Item RemovedFloorItem = null;
  69. if (!session.GetPlayer().GetInventory().TryRemoveItem(ItemId, out RemovedFloorItem))
  70. {
  71. return;
  72. }
  73. if (instance.GetItems().TrySetFloorItem(session.GetPlayer(), Item, X, Y, Rotation, out NewPosition))
  74. {
  75. using (var DbCon = Mango.GetServer().GetDatabase().GetConnection())
  76. {
  77. try
  78. {
  79. DbCon.Open();
  80. DbCon.BeginTransaction();
  81. DbCon.SetQuery("UPDATE `items` SET `room_pos_x` = @x, `room_pos_y` = @y, `room_pos_z` = @z, `room_rot` = @rot, `user_id` = @uid, `room_id` = @rid, `room_wall_pos` = @wallpos WHERE `id` = @id;");
  82. DbCon.AddParameter("x", NewPosition.X);
  83. DbCon.AddParameter("y", NewPosition.Y);
  84. DbCon.AddParameter("z", NewPosition.Z);
  85. DbCon.AddParameter("rot", Rotation);
  86. DbCon.AddParameter("uid", 0);
  87. DbCon.AddParameter("rid", instance.Id);
  88. DbCon.AddParameter("wallpos", "");
  89. DbCon.AddParameter("id", Item.Id);
  90. DbCon.ExecuteNonQuery();
  91. Item.Position.X = NewPosition.X;
  92. Item.Position.Y = NewPosition.Y;
  93. Item.Position.Z = NewPosition.Z;
  94. Item.RoomRot = Rotation;
  95. Item.UserId = 0;
  96. Item.RoomId = instance.Id;
  97. Item.RoomWallPos = "";
  98. DbCon.Commit();
  99. }
  100. catch (MySqlException)
  101. {
  102. DbCon.Rollback();
  103. session.GetPlayer().GetInventory().TryAddFloorItem(Item);
  104. break;
  105. }
  106. }
  107. // to-do: we need to handle quests etc for this floor item and item handles (on place item).
  108. session.SendPacket(new FurniListRemoveComposer(Item));
  109. instance.GetAvatars().BroadcastPacket(new ObjectAddComposer(Item, instance));
  110. Mango.GetServer().GetItemEventManager().Handle(session, Item, ItemEventType.Placed, session.GetPlayer().GetAvatar().GetCurrentRoom());
  111. instance.GetMapping().RegenerateRelativeHeightmap();
  112. }
  113. else
  114. {
  115. session.GetPlayer().GetInventory().TryAddFloorItem(Item);
  116. }
  117. break;
  118. case ItemType.WALL:
  119. string[] CorrectedData = new string[Data.Length - 1];
  120. for (int i = 1; i < Data.Length; i++)
  121. {
  122. CorrectedData[i - 1] = Data[i];
  123. }
  124. string WallPos = string.Empty;
  125. Item RemovedWallItem = null;
  126. if (!session.GetPlayer().GetInventory().TryRemoveItem(ItemId, out RemovedWallItem))
  127. {
  128. return;
  129. }
  130. if (instance.GetItems().TrySetWallItem(session.GetPlayer(), Item, CorrectedData, out WallPos))
  131. {
  132. using (var DbCon = Mango.GetServer().GetDatabase().GetConnection())
  133. {
  134. try
  135. {
  136. DbCon.Open();
  137. DbCon.BeginTransaction();
  138. DbCon.SetQuery("UPDATE `items` SET `room_pos_x` = @x, `room_pos_y` = @y, `room_pos_z` = @z, `room_rot` = @rot, `user_id` = @uid, `room_id` = @rid, `room_wall_pos` = @wallpos WHERE `id` = @id;");
  139. DbCon.AddParameter("x", 0);
  140. DbCon.AddParameter("y", 0);
  141. DbCon.AddParameter("z", 0);
  142. DbCon.AddParameter("rot", 0);
  143. DbCon.AddParameter("uid", 0);
  144. DbCon.AddParameter("rid", instance.Id);
  145. DbCon.AddParameter("wallpos", WallPos);
  146. DbCon.AddParameter("id", Item.Id);
  147. DbCon.ExecuteNonQuery();
  148. Item.Position.X = 0;
  149. Item.Position.Y = 0;
  150. Item.Position.Z = 0;
  151. Item.RoomRot = 0;
  152. Item.UserId = 0;
  153. Item.RoomId = instance.Id;
  154. Item.RoomWallPos = WallPos;
  155. DbCon.Commit();
  156. }
  157. catch (MySqlException)
  158. {
  159. DbCon.Rollback();
  160. session.GetPlayer().GetInventory().TryAddWallItem(Item);
  161. }
  162. }
  163. instance.GetAvatars().BroadcastPacket(new ItemAddComposer(Item, session.GetPlayer().Username));
  164. session.SendPacket(new FurniListRemoveComposer(Item));
  165. Mango.GetServer().GetItemEventManager().Handle(session, Item, ItemEventType.Placed, session.GetPlayer().GetAvatar().GetCurrentRoom());
  166. if (IsPlacingGuestSticky)
  167. {
  168. instance.GetItems().GiveTemporaryStickyEditingRights(Item.Id, session.GetPlayer().Id);
  169. session.SendPacket(new ItemDataUpdateComposer(Item));
  170. }
  171. }
  172. else
  173. {
  174. session.GetPlayer().GetInventory().TryAddWallItem(Item);
  175. }
  176. break;
  177. }
  178. }
  179. }
  180. }