예제 #1
0
        public static bool HandleApplyJoin(Models.Entities.Player player, Models.Packets.Guilds.GuildPacket packet)
        {
            if (player.Battle != null)
            {
                return(true);
            }

            if (packet.Data == player.ClientId)
            {
                return(false);
            }

            if (player.Guild != null)
            {
                return(false);
            }

            Models.Maps.IMapObject mapObject = null;

            if (player.ApplyGuildMemberClientId == 0)
            {
                if (player.GetFromScreen(packet.Data, out mapObject))
                {
                    var requestPlayer = mapObject as Models.Entities.Player;
                    if (requestPlayer != null)
                    {
                        if (requestPlayer.Guild != null && (
                                requestPlayer.GuildMember.Rank == Enums.GuildRank.GuildLeader ||
                                requestPlayer.GuildMember.Rank == Enums.GuildRank.DeputyLeader
                                ))
                        {
                            requestPlayer.ApplyGuildMemberClientId = player.ClientId;

                            requestPlayer.ClientSocket.Send(new Models.Packets.Guilds.GuildPacket
                            {
                                Action = Enums.GuildAction.ApplyJoin,
                                Data   = player.ClientId
                            });
                        }
                    }
                }

                return(true);
            }

            if (player.ApplyGuildMemberClientId != packet.Data)
            {
                return(true);
            }

            player.ApplyGuildMemberClientId = 0;

            if (player.GetFromScreen(packet.Data, out mapObject))
            {
                var invitePlayer = mapObject as Models.Entities.Player;
                if (invitePlayer != null)
                {
                    if (invitePlayer.Guild != null && (
                            invitePlayer.GuildMember.Rank == Enums.GuildRank.GuildLeader ||
                            invitePlayer.GuildMember.Rank == Enums.GuildRank.DeputyLeader
                            ))
                    {
                        invitePlayer.Guild.AddMember(player, Enums.GuildRank.Member);
                    }
                }
            }

            return(true);
        }
예제 #2
0
        /// <summary>
        /// Validates a magic attack.
        /// </summary>
        /// <param name="attacker">The attacker.</param>
        /// <param name="packet">The packet.</param>
        /// <param name="target">The target.</param>
        /// <returns>The status of the validation. (0 = success.)</returns>
        private static int ValidateMagicAttack(AttackableEntityController attacker, Models.Packets.Entities.InteractionPacket packet, out AttackableEntityController target)
        {
            target = null;
            if (packet == null)
            {
                return(1);
            }

            if (!attacker.AttackableEntity.Alive)
            {
                return(2);
            }

            if (!Tools.RangeTools.ValidDistance(attacker.MapObject.X, attacker.MapObject.Y, packet.X, packet.Y))
            {
                return(3);
            }

            Models.Maps.IMapObject targetMapObject = null;
            bool requiresTarget = false;

            if (packet.TargetClientId > 0)
            {
                if (!attacker.GetFromScreen(packet.TargetClientId, out targetMapObject) &&
                    packet.TargetClientId != attacker.AttackableEntity.ClientId)
                {
                    return(4);
                }
                else
                {
                    requiresTarget = packet.TargetClientId != attacker.AttackableEntity.ClientId;
                }
            }

            target = targetMapObject as AttackableEntityController;
            if (target != null)
            {
                var targetPlayer = target as Player;
                if (targetPlayer != null)
                {
                    if (!targetPlayer.LoggedIn)
                    {
                        return(5);
                    }

                    if (DateTime.UtcNow < targetPlayer.LoginProtectionEndTime)
                    {
                        return(5);
                    }

                    if (DateTime.UtcNow < targetPlayer.ReviveProtectionEndTime)
                    {
                        return(6);
                    }
                }

                if (!Tools.RangeTools.ValidDistance(attacker.MapObject.X, attacker.MapObject.Y, target.MapObject.X, target.MapObject.Y))
                {
                    return(7);
                }

                if (!target.AttackableEntity.Alive &&
                    packet.MagicType != 1100 && packet.MagicType != 1050)
                {
                    return(8);
                }
            }
            else if (requiresTarget)
            {
                return(10);
            }

            return(0);
        }