public static bool Handle(Models.Entities.Player player, Models.Packets.Items.ItemActionPacket packet) { var arenaBattle = player.Battle as Controllers.Arena.ArenaBattleController; if (player.Battle != null && !(player.Battle is Controllers.Arena.ArenaBattleController)) { return(true); } Models.Items.Item item; if (!player.Inventory.TryGetItem(packet.ClientId, out item)) { Database.Dal.Accounts.Ban( player.DbPlayer.Account, Drivers.Messages.INVALID_USE_ITEM, Database.Models.DbAccount.BanRangeType.Perm); player.ClientSocket.Disconnect(Drivers.Messages.INVALID_USE_ITEM); return(false); } if (item.IsMisc) { player.AddActionLog("ItemUsage", item.DbItem.Id); if (!Collections.ItemScriptCollection.Invoke(player, item.DbItem.Id)) { player.SendFormattedSystemMessage("ITEM_USAGE_NOT_FOUND", true, item.DbItem.Name, item.DbItem.Id); } } else { var position = (Enums.ItemPosition)packet.Data1; if (position != Enums.ItemPosition.Inventory) { player.Equipments.Equip(item, position, true); } } return(true); }
public static bool Handle(Models.Entities.Player player, Models.Packets.Items.ItemActionPacket packet) { if (!player.Alive) { return(true); } if (player.Battle != null) { return(true); } var location = player.Map.GetValidItemCoordinate(player.X, player.Y); if (location.Valid) { Models.Items.Item item = player.Inventory.Find(i => i.ClientId == packet.ClientId); if (item != null && item.Discardable) { player.AddActionLog("ItemDrop", item.DbOwnerItem.Id); if (player.Inventory.Remove(item.ClientId)) { item.Drop(player.MapId, location.X, location.Y, true, player.ClientId); } } else { Database.Dal.Accounts.Ban( player.DbPlayer.Account, Drivers.Messages.INVALID_DROP_ITEM, Database.Models.DbAccount.BanRangeType.Perm); player.ClientSocket.Disconnect(Drivers.Messages.INVALID_DROP_ITEM); return(false); } } return(true); }
public static bool HandleSteed(Models.Entities.Player player, Models.Packets.Items.CompositionPacket packet) { Models.Items.Item mainItem; Models.Items.Item minorItem; if (VerifyComposition(player, packet, out mainItem, out minorItem) && mainItem.IsSteed && minorItem.IsSteed) { player.AddActionLog("SteedComposition", mainItem.DbOwnerItem.Id); int color1 = (int)mainItem.DbOwnerItem.SocketRGB; int color2 = (int)minorItem.DbOwnerItem.SocketRGB; int B1 = color1 & 0xFF; int B2 = color2 & 0xFF; int G1 = (color1 >> 8) & 0xFF; int G2 = (color2 >> 8) & 0xFF; int R1 = (color1 >> 16) & 0xFF; int R2 = (color2 >> 16) & 0xFF; int newB = (int)Math.Floor(0.9 * B1) + (int)Math.Floor(0.1 * B2); int newG = (int)Math.Floor(0.9 * G1) + (int)Math.Floor(0.1 * G2); int newR = (int)Math.Floor(0.9 * R1) + (int)Math.Floor(0.1 * R2); uint newColor = (uint)(newB | (newG << 8) | (newR << 16)); if (newColor == mainItem.DbOwnerItem.SocketRGB) { return(true); } mainItem.DbOwnerItem.SocketRGB = newColor; DoNormalComposition(player, minorItem, mainItem); } UpdateClient(player, mainItem); return(true); }
/// <summary> /// Let's a player enter the house. /// </summary> /// <param name="player">The player that should enter.</param> public void EnterHouse(Models.Entities.Player player) { if (player.ClientId != PlayerHouse.Player.ClientId) { return; } player.AddActionLog("EnterHouse", player.MapId); if (PlayerHouse.DbPlayerHouse.IsBig) { player.TeleportDynamic(PlayerHouse.DynamicMapId, 53, 83); } else { player.TeleportDynamic(PlayerHouse.DynamicMapId, 32, 40); } if (player.GetAllInScreen().Count < 10) { if (player.Team != null) { foreach (var member in player.Team.GetMembers()) { if (PlayerHouse.DbPlayerHouse.IsBig) { member.TeleportDynamic(PlayerHouse.DynamicMapId, 53, 83); } else { member.TeleportDynamic(PlayerHouse.DynamicMapId, 32, 40); } } } } }
/// <summary> /// Adds a member to the guild. /// </summary> /// <param name="player">The player.</param> /// <param name="rank">The starting rank.</param> /// <param name="update">A boolean determining whether the client of the player should be updated.</param> public void AddMember(Models.Entities.Player player, Enums.GuildRank rank, bool update = true) { var guildMember = new GuildMember(new Database.Models.DbGuildRank { GuildId = Guild.Id, PlayerId = player.DbPlayer.Id, PlayerName = player.Name, PlayerLevel = player.Level, SilverDonation = 0, CPDonation = 0, GuildRank = rank.ToString(), JoinDate = Drivers.Time.GetTime(Drivers.Time.TimeType.Day) }); if (guildMember.DbGuildRank.Create() && _members.TryAdd(player.DbPlayer.Id, guildMember)) { player.AddActionLog("JoinGuild", Guild.Id); guildMember.Player = player; player.Guild = Guild; player.GuildMember = guildMember; if (rank == Enums.GuildRank.GuildLeader) { Guild.GuildLeader = guildMember; } if (update) { player.UpdateClientGuild(); player.UpdateScreen(true); } } _cachedSortedMembers = null; }
public static void OpenShop(Models.Entities.Player player, uint shopId) { player.AddActionLog("OpenShop", shopId); OpenUpgrade(player, 32, shopId); }
public static bool HandleMarry(Models.Entities.Player player, Models.Packets.Entities.InteractionPacket packet) { if (packet.TargetClientId == player.ClientId) { return(false); } if (player.Spouse != "None") { return(true); } Models.Maps.IMapObject obj; if (player.GetFromScreen(packet.TargetClientId, out obj)) { var marriageTarget = obj as Models.Entities.Player; if (marriageTarget != null) { if (marriageTarget.Spouse != "None") { return(true); } if (marriageTarget.PendingSpouse != player.ClientId) { return(true); } player.AddActionLog("Marriage", player.Name + " : " + marriageTarget.Name); marriageTarget.Spouse = player.Name; player.Spouse = marriageTarget.Name; player.ClientSocket.Send(new Models.Packets.Misc.StringPacket { Action = Enums.StringAction.Mate, Data = player.ClientId, String = marriageTarget.Name }); marriageTarget.ClientSocket.Send(new Models.Packets.Misc.StringPacket { Action = Enums.StringAction.Mate, Data = marriageTarget.ClientId, String = player.Name }); var fireworks = new Models.Packets.Misc.StringPacket { Action = Enums.StringAction.MapEffect, PositionX = player.X, PositionY = player.Y, String = "firework-2love" }; player.ClientSocket.Send(fireworks); fireworks.PositionX = marriageTarget.X; fireworks.PositionY = marriageTarget.Y; marriageTarget.ClientSocket.Send(fireworks); Collections.PlayerCollection.BroadcastFormattedMessage("MARRIAGE_CONGRATZ", player.Name, marriageTarget.Name); } } return(true); }
/// <summary> /// Handler for disconnections. /// </summary> /// <param name="client">The disconnected client.</param> public static void HandleDisconnection(Models.Entities.Player player) { Collections.PlayerCollection.Remove(player); if (player.Map != null) { if (player.Map.IsDynamic) { player.TeleportToLastMap(); } // Save coordinates and possible other unsaved changes ... player.DbPlayer.Update(); player.Map.RemoveFromMap(player); player.ClearScreen(); player.Map = null; } else if (player.DbPlayer != null) { // Save unsaved changes ... player.DbPlayer.Update(); } if (player.Team != null) { if (player.Team.IsLeader(player)) { var members = player.Team.Delete(); foreach (var member in members) { member.Team = null; if (member.ClientId != player.ClientId) { member.ClientSocket.Send(new Models.Packets.Team.TeamActionPacket { Action = Enums.TeamAction.Dismiss, ClientId = player.ClientId }); } } } player.Team = null; } if (player.Guild != null) { player.GuildMember.Player = null; player.GuildMember = null; player.Guild = null; } if (player.Nobility != null) { player.Nobility.Player = null; player.Nobility = null; } if (player.Battle != null) { player.Battle.HandleDisconnect(player); } if (player.ArenaInfo != null) { player.ArenaInfo.Player = null; player.ArenaInfo = null; } if (player.LoggedIn) { var traceId = player.ClientId.ToString("X2") + ";" + DateTime.UtcNow.ToBinary().ToString("X2"); player.ClientSocket.PacketTrace.Clone() .Select(packet => { return(new Database.Models.DbPacketTrace { PacketId = (int)packet.PacketType, PacketSubObject = packet.SubTypeObject != null ? packet.SubTypeObject.ToString() : string.Empty, OwnerId = player.DbPlayer.Id, TraceId = traceId, Size = packet.PhysicalSize, VirtualSize = (int)packet.VirtualSize, Buffer = (byte[])packet }); }).Create(); (new Database.Models.DbDisconnectTrace { TraceId = traceId, OwnerId = player.DbPlayer.Id, DisconnectReason = player.ClientSocket.LastException != null ? player.ClientSocket.LastException.ToString() : player.ClientSocket.DisconnectReason }).Create(); } Console.WriteLine(Drivers.Messages.SOCKET_DISCONNECT_MESSAGE, player.ClientSocket.IPAddress, player.ClientSocket.DisconnectReason); player.AddActionLog("Disconnect"); player.Free(); }
public static bool Handle(Models.Entities.Player player, Models.Packets.Items.ItemActionPacket packet) { if (!player.Alive) { return(true); } if (player.MapId != 1036 || !Tools.RangeTools.ValidDistance(320, 229, player.X, player.Y)) { return(true); } Models.Items.Item blessItem; if (!player.Inventory.TryGetItem(packet.ClientId, out blessItem)) { player.SendSystemMessage("BLESS_ITEM_NOT_FOUND"); return(true); } if (blessItem.DbOwnerItem.CurrentDura < blessItem.DbOwnerItem.MaxDura) { player.SendSystemMessage("BLESS_ITEM_LOW_DURA"); return(true); } if (blessItem.IsGarment || blessItem.IsArrow || blessItem.IsBottle || blessItem.IsMountArmor || blessItem.IsMisc || blessItem.IsFan || blessItem.IsTower) { player.SendSystemMessage("BLESS_ITEM_INVALID"); return(true); } int requiredTortoiseGems = 5; byte setBless = 1; switch (blessItem.DbOwnerItem.Bless) { case 0: requiredTortoiseGems = 5; break; default: requiredTortoiseGems = blessItem.DbOwnerItem.Bless; setBless = (byte)(requiredTortoiseGems + 2); break; } if (setBless > 7) { player.SendSystemMessage("BLESS_ITEM_MAX_BLESS"); return(true); } int tortoiseAmount; if (!player.Inventory.ContainsById(700073, out tortoiseAmount) || tortoiseAmount < requiredTortoiseGems) { player.SendSystemMessage("BLESS_NOT_ENOUGH_TORTOISE_GEMS"); return(true); } player.AddActionLog("BlessItem", blessItem.DbOwnerItem.Id); if (player.Inventory.RemoveByCount(700073, requiredTortoiseGems)) { blessItem.DbOwnerItem.Bless = setBless; blessItem.DbOwnerItem.Update(); blessItem.UpdateClient(player, Enums.ItemUpdateAction.Update); player.ClientSocket.Send(packet); } return(true); }
public static bool Handle(Models.Entities.Player player, Models.Packets.Trade.TradePacket packet) { if (!player.Trade.Trading) { return(true); } if (!player.Trade.WindowOpen) { return(true); } if (!player.Trade.Accepted && !player.Trade.PartnerAccepted) { player.Trade.Accepted = true; player.Trade.Partner.Trade.Accepted = true; packet.TargetClientId = player.ClientId; player.Trade.Partner.ClientSocket.Send(packet); } else if (player.Trade.Accepted && player.Trade.Partner.Trade.Accepted) { bool tradeSuccess = true; foreach (var item in player.Trade.Items) { if (!player.Inventory.Contains(item.ClientId)) { tradeSuccess = false; } } foreach (var item in player.Trade.PartnerItems) { if (!player.Trade.Partner.Inventory.Contains(item.ClientId)) { tradeSuccess = false; } } if (player.Money < player.Trade.Money) { tradeSuccess = false; } if (player.Trade.Partner.Money < player.Trade.PartnerMoney) { tradeSuccess = false; } if (player.CPs < player.Trade.CPs) { tradeSuccess = false; } if (player.Trade.Partner.CPs < player.Trade.PartnerCPs) { tradeSuccess = false; } if (tradeSuccess) { foreach (var item in player.Trade.Items) { player.AddActionLog("TradeItem", string.Format("{0} -> {1} : {2}", player.DbPlayer.Id, player.Trade.Partner.DbPlayer.Id, item.DbItem.Id)); var removedItem = player.Inventory.Pop(item.ClientId); if (removedItem != null) { player.Trade.Partner.Inventory.Add(removedItem); } } foreach (var item in player.Trade.PartnerItems) { player.AddActionLog("TradeItem", string.Format("{0} -> {1} : {2}", player.Trade.Partner.DbPlayer.Id, player.DbPlayer.Id, item.DbItem.Id)); var removedItem = player.Trade.Partner.Inventory.Pop(item.ClientId); if (removedItem != null) { player.Inventory.Add(item); } } if (player.Money >= player.Trade.Money) { player.AddActionLog("TradeMoney", player.Trade.Money); player.Money -= player.Trade.Money; player.Trade.Partner.Money += player.Trade.Money; } if (player.Trade.Partner.Money >= player.Trade.PartnerMoney) { player.AddActionLog("TradePartnerMoney", player.Trade.PartnerMoney); player.Trade.Partner.Money -= player.Trade.PartnerMoney; player.Money += player.Trade.PartnerMoney; } if (player.CPs >= player.Trade.CPs) { player.AddActionLog("TradeCPs", player.Trade.CPs); player.CPs -= player.Trade.CPs; player.Trade.Partner.CPs += player.Trade.CPs; } if (player.Trade.Partner.CPs >= player.Trade.PartnerCPs) { player.AddActionLog("TradePartnerCPs", player.Trade.PartnerCPs); player.Trade.Partner.CPs -= player.Trade.PartnerCPs; player.CPs += player.Trade.PartnerCPs; } var partner = player.Trade.Partner; partner.Trade.Reset(); player.Trade.Reset(); packet.Action = Enums.TradeAction.HideTable; packet.TargetClientId = partner.ClientId; player.ClientSocket.Send(packet); packet.TargetClientId = player.ClientId; partner.ClientSocket.Send(packet); player.SendSystemMessage("TRADE_SUCCESS"); partner.SendSystemMessage("TRADE_SUCCESS"); } else { var partner = player.Trade.Partner; partner.Trade.Reset(); player.Trade.Reset(); packet.Action = Enums.TradeAction.HideTable; packet.TargetClientId = partner.ClientId; player.ClientSocket.Send(packet); packet.TargetClientId = player.ClientId; partner.ClientSocket.Send(packet); player.SendSystemMessage("TRADE_FAIL"); partner.SendSystemMessage("TRADE_FAIL"); } } return(true); }