예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        /// <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);
                        }
                    }
                }
            }
        }
예제 #5
0
        /// <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;
        }
예제 #6
0
 public static void OpenShop(Models.Entities.Player player, uint shopId)
 {
     player.AddActionLog("OpenShop", shopId);
     OpenUpgrade(player, 32, shopId);
 }
예제 #7
0
        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();
        }
예제 #9
0
        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);
        }
예제 #10
0
        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);
        }