Beispiel #1
0
        /// <summary>
        /// 通过[ID]二分快速查表
        /// </summary>
        /// <param name="TableID">ID</param>
        /// <returns></returns>
        public static ShowEffect Query(this List <ShowEffect> sorted, uint TableID)
        {
            var key = new ShowEffect()
            {
                TableID = TableID
            };
            var comparer = new Comparer1();
            var index    = sorted.BinarySearch(key, comparer);

            return(index >= 0 ? sorted[index] : default(ShowEffect));
        }
Beispiel #2
0
        private void AEBulletNova(RealmTime time, Item item, Position target, ActivateEffect eff)
        {
            var prjs    = new Projectile[20];
            var prjDesc = item.Projectiles[0]; //Assume only one
            var batch   = new Packet[21];

            for (var i = 0; i < 20; i++)
            {
                var proj = CreateProjectile(prjDesc, item.ObjectType,
                                            Random.Next(prjDesc.MinDamage, prjDesc.MaxDamage),
                                            time.TotalElapsedMs, target, (float)(i * (Math.PI * 2) / 20));
                Owner.EnterWorld(proj);
                FameCounter.Shoot(proj);
                batch[i] = new ServerPlayerShoot()
                {
                    BulletId      = proj.ProjectileId,
                    OwnerId       = Id,
                    ContainerType = item.ObjectType,
                    StartingPos   = target,
                    Angle         = proj.Angle,
                    Damage        = (short)proj.Damage
                };
                prjs[i] = proj;
            }
            batch[20] = new ShowEffect()
            {
                EffectType     = EffectType.Trail,
                Pos1           = target,
                TargetObjectId = Id,
                Color          = new ARGB(0xFFFF00AA)
            };

            foreach (var plr in Owner.Players.Values
                     .Where(p => p.DistSqr(this) < RadiusSqr))
            {
                plr.Client.SendPackets(batch);
            }
        }
Beispiel #3
0
        private void AELightning(RealmTime time, Item item, Position target, ActivateEffect eff)
        {
            const double coneRange  = Math.PI / 4;
            var          mouseAngle = Math.Atan2(target.Y - Y, target.X - X);

            // get starting target
            var startTarget = this.GetNearestEntity(MaxAbilityDist, false, e => e is Enemy &&
                                                    Math.Abs(mouseAngle - Math.Atan2(e.Y - Y, e.X - X)) <= coneRange);

            // no targets? bolt air animation
            if (startTarget == null)
            {
                var noTargets = new Packet[3];
                var angles    = new double[] { mouseAngle, mouseAngle - coneRange, mouseAngle + coneRange };
                for (var i = 0; i < 3; i++)
                {
                    var x = (int)(MaxAbilityDist * Math.Cos(angles[i])) + X;
                    var y = (int)(MaxAbilityDist * Math.Sin(angles[i])) + Y;
                    noTargets[i] = new ShowEffect()
                    {
                        EffectType     = EffectType.Trail,
                        TargetObjectId = Id,
                        Color          = new ARGB(0xffff0088),
                        Pos1           = new Position()
                        {
                            X = x,
                            Y = y
                        },
                        Pos2 = new Position()
                        {
                            X = 350
                        }
                    };
                }
                BroadcastSync(noTargets, p => this.DistSqr(p) < RadiusSqr);
                return;
            }

            var current = startTarget;
            var targets = new Entity[eff.MaxTargets];

            for (int i = 0; i < targets.Length; i++)
            {
                targets[i] = current;
                var next = current.GetNearestEntity(10, false, e =>
                {
                    if (!(e is Enemy) ||
                        e.HasConditionEffect(ConditionEffects.Invincible) ||
                        e.HasConditionEffect(ConditionEffects.Stasis) ||
                        Array.IndexOf(targets, e) != -1)
                    {
                        return(false);
                    }

                    return(true);
                });

                if (next == null)
                {
                    break;
                }

                current = next;
            }

            var pkts = new List <Packet>();

            for (var i = 0; i < targets.Length; i++)
            {
                if (targets[i] == null)
                {
                    break;
                }

                var prev = i == 0 ? this : targets[i - 1];

                (targets[i] as Enemy).Damage(this, time, eff.TotalDamage, false);

                if (eff.ConditionEffect != null)
                {
                    targets[i].ApplyConditionEffect(new ConditionEffect()
                    {
                        Effect     = eff.ConditionEffect.Value,
                        DurationMS = (int)(eff.EffectDuration * 1000)
                    });
                }

                pkts.Add(new ShowEffect()
                {
                    EffectType     = EffectType.Lightning,
                    TargetObjectId = prev.Id,
                    Color          = new ARGB(0xffff0088),
                    Pos1           = new Position()
                    {
                        X = targets[i].X,
                        Y = targets[i].Y
                    },
                    Pos2 = new Position()
                    {
                        X = 350
                    }
                });
            }
            BroadcastSync(pkts, p => this.DistSqr(p) < RadiusSqr);
        }