public override void Run(RoleBase caster, Space space, MagicArgs args) { caster.ClearAttacher(); for (int i = 0; i < args.Number; i++) { Point p = new Point(caster.Coordinate.X + RandomSeed.Next(-5, 5), caster.Coordinate.Y + RandomSeed.Next(-5, 5)); if (!space.Terrain.InEffectiveRange(p) || (args.SpaceLayer == SpaceLayers.Ground && space.Terrain.Matrix[(int)p.X, (int)p.Y] == 0)) { p = caster.Coordinate; } AnimationBase magic = new AnimationBase() { Code = args.ResCode, SpaceLayer = args.SpaceLayer, Position = space.Terrain.GetPositionFromCoordinate(p), Z = args.MagicLayer == MagicLayers.Ground ? -1 : (int)args.Position.Y }; EventHandler handler = null; magic.Disposed += handler = delegate { magic.Disposed -= handler; space.RemoveAnimation(magic); }; space.AddAnimation(magic); //解析配置 XElement xMonster = Infos["Monster"].DescendantsAndSelf("Monsters").Elements().Single(X => X.Attribute("ID").Value == args.AdditionalEffect.ToString()); Monster monster = new Monster(space.Terrain) { ID = (int)xMonster.Attribute("ID") + countID, AttachID = caster.AttachID, Code = (int)xMonster.Attribute("Code"), ArmorCode = (int)xMonster.Attribute("ArmorCode"), AttackRange = (int)xMonster.Attribute("AttackRange"), FullName = string.Format("{0}的召唤兽", caster.FullName), Profession = Professions.Monster, Direction = caster.Direction, State = States.Walking, Camp = caster.Camp, LifeMax = Convert.ToDouble(args.Tag), Life = Convert.ToDouble(args.Tag), SpaceLayer = caster.SpaceLayer, Coordinate = p, TacticAI = TacticAIs.GuardMaster, ActionAI = ActionAIs.Simple, FullNameColor = Colors.Orange, ATK = ObjectBase.RandomSeed.Next(1300, 1600), DEF = ObjectBase.RandomSeed.Next(600, 900), MAG = ObjectBase.RandomSeed.Next(400, 500), DEX = ObjectBase.RandomSeed.Next(0, 30), }; if (xMonster.Attribute("LearnedMagic").Value != string.Empty) { string[] str = xMonster.Attribute("LearnedMagic").Value.Split(','); for (int j = 0; j < str.Count(); j++) { string[] value = str[j].Split('_'); monster.LearnedMagic.Add(Convert.ToInt32(value[0]), Convert.ToInt32(value[1])); } } space.AddRole(monster, new RoleAddedEventArgs() { RegisterDisposedEvent = (bool)xMonster.Attribute("RegisterDisposedEvent"), RegisterIntervalTriggerEvent = (bool)xMonster.Attribute("RegisterIntervalTriggerEvent"), RegisterActionTriggerEvent = (bool)xMonster.Attribute("RegisterActionTriggerEvent"), RegisterDoAttackEvent = (bool)xMonster.Attribute("RegisterDoAttackEvent"), RegisterDoCastingEvent = (bool)xMonster.Attribute("RegisterDoCastingEvent"), RegisterPositionChangedEvent = (bool)xMonster.Attribute("RegisterPositionChangedEvent"), RegisterLifeChangedEvent = (bool)xMonster.Attribute("RegisterLifeChangedEvent"), }); monster.Master = caster; caster.AttachRoles.Add(monster); countID++; if (countID == 10000) { countID = 0; } } }
///<summary>进度检查(网络版中为所有玩家都要检测,目前单机只检测players[0]即主角)</summary> protected override void StepCheck(object sender, EventArgs e) { SetDescription(string.Format("Step {0}: {1}", (int)Step, stepExplanation[Step])); switch (Step) { case Steps.设置右键魔法8级连锁闪电或6级石封箭: if ((players[0].CurrentMagic.Level == 8 && players[0].CurrentMagic.Code == 9) || (players[0].CurrentMagic.Level == 6 && players[0].CurrentMagic.Code == 12)) { space.AddAnimation(new AnimationBase() { ID = 0, Code = 82, Position = new Point(-583, 1695), Z = 1695, Tip = "传送点", Loop = true, }); space.Terrain.AddTeleport(new Teleport() { Code = 0, ToSpace = space.Code, Instance = InstanceTypes.None, ToCoordinate = new Point(46, 72), ToDirection = Directions.SouthEast }, "45_68_0,46_68_0,"); StartCountdown(Steps.十二秒内到达传送点, 12); } break; case Steps.消灭所有翼族: if (space.AllRoles().Count == players.Count) { //这样的检测方案只是暂定的,很可能存在BUG Step = Steps.进入传送点到达山的彼岸; space.AddAnimation(new AnimationBase() { ID = 0, Code = 82, Position = new Point(-238, 2018), Z = 2018, Tip = "传送点", Loop = true, }); space.Terrain.AddTeleport(new Teleport() { Code = 1, ToSpace = space.Code, Instance = InstanceTypes.None, ToCoordinate = new Point(73, 25), ToDirection = Directions.SouthWest }, "63_71_0,62_70_0,62_72_0,"); } break; case Steps.设置右键魔法为7级陨石坠落: if (players[0].CurrentMagic.Level == 7 && players[0].CurrentMagic.Code == 7) { StartCountdown(Steps.等待3秒刺客来袭, 3); } break; case Steps.消灭所有刺客: if (space.AllRoles().Count == players.Count) { Step = Steps.骑上马并移动到59_60附近开启封印; } break; case Steps.骑上马并移动到59_60附近开启封印: if (TriggerOrgan[(int)Step]) { StartCountdown(Steps.在23秒内为武器附上烟火粒子, 23); } break; case Steps.在23秒内为武器附上烟火粒子: if (players[0].DisplayWeaponParticle) { StartCountdown(Steps.在180秒内消灭蜘蛛魔王, 180); Monster boss = new Monster(space.Terrain) { ID = 3120000, //AttachID = 4100000, Code = 2, FullName = "蜘蛛魔王", LearnedMagic = new Dictionary<int, int>() { { 0, 6 }, { 1, 6 }, { 2, 6 }, { 3, 6 }, { 4, 6 }, { 5, 6 }, { 6, 6 }, { 7, 6 }, { 8, 6 }, { 9, 6 }, { 10, 6 }, { 11, 6 }, { 12, 6 }, { 13, 6 }, { 14, 6 }, { 15, 6 }, { 16, 6 }, { 17, 6 }, { 18, 6 } }, Profession = Professions.Monster, ArmorCode = 16, Direction = Directions.SouthEast, State = States.Walking, Camp = Camps.Eval, TacticAI = TacticAIs.GoalLeader, ActionAI = ActionAIs.Persistent, LifeMax = 640000, Life = 640000, ATK = 24059, DEF = 1500, MAG = 500, DEX = ObjectBase.RandomSeed.Next(0, 30), Coordinate = new Point(49, 59) }; space.AddRole(boss, new RoleAddedEventArgs() { RegisterDisposedEvent = true, RegisterIntervalTriggerEvent = true, RegisterActionTriggerEvent = true, RegisterDoAttackEvent = true, RegisterDoCastingEvent = true, RegisterPositionChangedEvent = true, RegisterLifeChangedEvent = true, }); space.MusicUri = "Boss"; } break; case Steps.在180秒内消灭蜘蛛魔王: if (space.AllRoles().Count == players.Count) { Step = Steps.副本完成通过传送门离开; space.MusicUri = "100"; space.AddAnimation(new AnimationBase() { ID = 0, Code = 81, Position = new Point(-300, 1591), Z = 1591, Tip = "传送到【废墟秘境】", Loop = true, }); } break; } }
///<summary>进度检查(网络版中为所有玩家都要检测,目前单机只检测players[0]即主角)</summary> protected override void StepCheck(object sender, EventArgs e) { SetDescription(string.Format("Step {0}: {1}", (int)Step, stepExplanation[Step])); switch (Step) { case Steps.于4个坐标处放置祭旗: if (TriggerOrgan[0] && TriggerOrgan[1] && TriggerOrgan[2] && TriggerOrgan[3]) { Step = Steps.设置右键魔法为9级烈焰喷射; } break; case Steps.设置右键魔法为9级烈焰喷射: if (players[0].CurrentMagic.Level == 9 && players[0].CurrentMagic.Code == 4) { Step = Steps.召唤王者英灵; } break; case Steps.召唤王者英灵: if (TriggerOrgan[4]) { Step = Steps.干掉被魔化俯身的王者英灵; Monster boss = new Monster(space.Terrain) { ID = 3130000, //AttachID = 4110000, Code = 2, FullName = "王者英灵(魔化俯身)", LearnedMagic = new Dictionary<int, int>() { { 0, 6 }, { 1, 6 }, { 2, 6 }, { 3, 6 }, { 4, 6 }, { 5, 6 }, { 6, 6 }, { 7, 6 }, { 8, 6 }, { 9, 6 }, { 10, 6 }, { 11, 6 }, { 12, 6 }, { 13, 6 }, { 14, 6 }, { 15, 6 }, { 16, 6 }, { 17, 6 }, { 18, 6 } }, Profession = Professions.Monster, ArmorCode = 17, Direction = Directions.South, State = States.Walking, Camp = Camps.Eval, TacticAI = TacticAIs.GoalLeader, ActionAI = ActionAIs.Persistent, LifeMax = 160000, Life = 160000, ATK = 17466, DEF = 1500, MAG = 500, DEX = ObjectBase.RandomSeed.Next(0, 30), Coordinate = new Point(46, 38) }; space.AddRole(boss, new RoleAddedEventArgs() { RegisterDisposedEvent = true, RegisterIntervalTriggerEvent = true, RegisterActionTriggerEvent = true, RegisterDoAttackEvent = true, RegisterDoCastingEvent = true, RegisterPositionChangedEvent = true, RegisterLifeChangedEvent = true, }); space.MusicUri = "Boss"; } break; case Steps.干掉被魔化俯身的王者英灵: if (space.AllRoles().Count == players.Count) { Step = Steps.与王者英灵第一次交谈; space.MusicUri = "101"; npc = new NPC(space.Terrain) { ID = 3130001, Code = 2, ArmorCode = 17, FullName ="王者英灵", Profession = Professions.NPC, DefaultDirection = Directions.West, Direction = Directions.West, State = States.Walking, Camp = Camps.None, LifeMax = 100, Life = 100, Coordinate = new Point(46, 38), TacticAI = TacticAIs.None, ActionAI = ActionAIs.Simple, FullNameColor = Colors.Magenta, }; //加载说话内容 XElement args = Infos["NPC"].DescendantsAndSelf("NPCs").Elements().Single(X => X.Attribute("ID").Value == "3130001"); IEnumerable<XElement> talks = args.DescendantsAndSelf("Talks").Elements(); for (int j = 0; j < talks.Count(); j++) { npc.AddTalk(new Talk() { Content = talks.ElementAt(j).Attribute("Value").Value, Duration = (int)talks.ElementAt(j).Attribute("Duration") }); } //加载剧情内容 IEnumerable<XElement> dramas = args.DescendantsAndSelf("Dramas").Elements(); for (int j = 0; j < dramas.Count(); j++) { npc.AddDrama((int)dramas.ElementAt(j).Attribute("Avatar"), string.Format("{0}:{1}", dramas.ElementAt(j).Attribute("Name").Value, dramas.ElementAt(j).Attribute("Content").Value)); } space.AddRole(npc, new RoleAddedEventArgs() { RegisterDisposedEvent = (bool)args.Attribute("RegisterDisposedEvent"), RegisterIntervalTriggerEvent = (bool)args.Attribute("RegisterIntervalTriggerEvent"), RegisterActionTriggerEvent = (bool)args.Attribute("RegisterActionTriggerEvent"), RegisterDoAttackEvent = (bool)args.Attribute("RegisterDoAttackEvent"), RegisterDoCastingEvent = (bool)args.Attribute("RegisterDoCastingEvent"), RegisterPositionChangedEvent = (bool)args.Attribute("RegisterPositionChangedEvent"), RegisterLifeChangedEvent = (bool)args.Attribute("RegisterLifeChangedEvent"), }); } break; case Steps.与王者英灵第一次交谈: if (space.AllRoles().Count == players.Count) { Exit("副本【神邸秘境】 战斗失败"); break; } else if (TriggerOrgan[5]) { Step = Steps.跟随王者英灵走到秘境深处; npc.CleartTalk(); npc.AddTalk(new Talk() { Content = "跟紧啦,小妹!", Duration = 8000 }); npc.TaskInfo.Content.Clear(); npc.MoveTo(space.Terrain.GetPositionFromCoordinate(new Point(20, 11))); } break; case Steps.跟随王者英灵走到秘境深处: if (space.AllRoles().Count == players.Count) { Exit("副本【神邸秘境】 战斗失败"); break; } else if ((int)npc.Coordinate.X == 20 && (int)npc.Coordinate.Y == 11) { if (Math.Abs(players[0].Coordinate.X - npc.Coordinate.X) <= 5 && Math.Abs(players[0].Coordinate.Y - npc.Coordinate.Y) <= 5) { npc.DefaultDirection = npc.Direction = Directions.South; npc.CleartTalk(); npc.AddTalk(new Talk() { Content = "赶紧啦,你准备好了没?", Duration = 8000 }); Step = Steps.设置右键魔法为5级冰咆哮; } } break; case Steps.设置右键魔法为5级冰咆哮: if (space.AllRoles().Count == players.Count) { Exit("副本【神邸秘境】 战斗失败"); break; } else if (players[0].CurrentMagic.Level == 5 && players[0].CurrentMagic.Code == 13) { npc.TaskInfo.Avatar[0] = 5; npc.TaskInfo.Content.Add("5秒后大量追杀者将至,请守护我至少40秒以开启【未来之门】"); Step = Steps.与王者英灵第二次交谈; } break; case Steps.与王者英灵第二次交谈: if (space.AllRoles().Count == players.Count) { Exit("副本【神邸秘境】 战斗失败"); break; } else if (TriggerOrgan[6]) { npc.TaskInfo.Content.Clear(); npc.CleartTalk(); npc.AddTalk(new Talk() { Content = "保护我40秒!我将耗尽我全身真气开启【未来之门】", Duration = 8000 }); StartCountdown(Steps.延迟5秒大量敌人来袭, 5); space.MusicUri = "Boss"; } break; case Steps.消灭所有残余敌人: if (space.AllRoles().Count == players.Count) { Exit("副本【神邸秘境】 战斗失败"); break; } else if (space.AllRoles().Count == players.Count + 1) { npc.CleartTalk(); npc.AddTalk(new Talk() { Content = "感谢您的崇高!是您拯救了世界!", Duration = 8000 }); Step = Steps.副本完成通过传送门离开秘境; space.MusicUri = "101"; } break; } }