/// <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)); }
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); } }
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); }