private AoeFieldAction LoadAoeFieldAction(XmlElement node) { AoeFieldAction action = new AoeFieldAction(); action.duration = float.Parse(node.GetAttribute("duration")); action.interval = float.Parse(node.GetAttribute("interval")); action.emitters = new List <BuffEmitter>(); bool initRegion = false; for (int i = 0; i < node.ChildNodes.Count; ++i) { XmlElement child = (XmlElement)node.ChildNodes[i]; switch (node.ChildNodes[i].Name) { case "CircleRegion": action.type = RegionType.kCircle; action.radius = float.Parse(child.GetAttribute("radius")); initRegion = true; break; case "RectRegion": action.type = RegionType.kRect; action.width = float.Parse(child.GetAttribute("width")); action.height = float.Parse(child.GetAttribute("height")); initRegion = true; break; case "SectorRegion": action.type = RegionType.kSector; action.radius = float.Parse(child.GetAttribute("radius")); action.theta = float.Parse(child.GetAttribute("theta")); initRegion = true; break; case "BuffEmitter": BuffEmitter emitter = new BuffEmitter(); emitter.filter = (AoeFilter)Enum.Parse(typeof(AoeFilter), child.GetAttribute("filter")); string[] buffs = child.GetAttribute("buffs").Split('|'); emitter.buffs = new int[buffs.Length]; for (int n = 0; n < buffs.Length; ++n) { emitter.buffs[n] = int.Parse(buffs[n]); } action.emitters.Add(emitter); break; } } if (action.emitters.Count == 0) { throw new Exception("AoeFieldAction miss emitter!"); } if (!initRegion) { throw new Exception("AoeFieldAction miss region!"); } return(action); }
public BuffEmitter Copy() { BuffEmitter emitter = new BuffEmitter(); emitter.buffs = new int[buffs.Length]; for (int i = 0; i < buffs.Length; ++i) { emitter.buffs[i] = buffs[i]; } emitter.filter = filter; return(emitter); }
public BulletBase ShootBullet(int templateID, UnitBase shooter, UnitBase target, bool isAttack) { var config = ConfigManager.Bullet.getRow(templateID); BulletBase bullet = null; switch (config.BulletType) { case BulletType.kCoordBullet: bullet = new CoordBullet(shooter, target.position); break; case BulletType.kLineBullet: if (config.FixRange > 0) { var offset = (target.position - shooter.position).normalized * config.FixRange; bullet = new LineBullet(shooter, shooter.position + offset); } else { bullet = new LineBullet(shooter, target.position); } break; case BulletType.kPenteralBullet: if (config.FixRange > 0) { var offset = (target.position - shooter.position).normalized * config.FixRange; bullet = new PenetraBullet(shooter, config.DecayScale, shooter.position + offset); } else { bullet = new PenetraBullet(shooter, config.DecayScale, target.position); } break; case BulletType.kReturnBullet: if (config.FixRange > 0) { var offset = (target.position - shooter.position).normalized * config.FixRange; bullet = new ReturnBullet(shooter, config.DecayScale, shooter.position + offset); } else { bullet = new ReturnBullet(shooter, config.DecayScale, target.position); } break; case BulletType.kTrackBullet: bullet = new TrackBullet(shooter, target); break; default: throw new NotImplementedException("not implemented type " + config.BulletType.ToString()); } bullet.radius = config.Radius; bullet.speed = config.Speed; bullet.acceleration = config.Acceleration; if (isAttack) { bullet.InitDamage((int)shooter.ATK.value, config.DamageType, isAttack); } else if (config.Damage > 0) { bullet.InitDamage(config.Damage, config.DamageType, isAttack); } if (config.AoeRadius > 0) { List <SkillModule.BuffEmitter> emitters = new List <SkillModule.BuffEmitter>(config.BuffEmitter.Length); for (int i = 0; i < config.BuffEmitter.Length; ++i) { var emitter = new SkillModule.BuffEmitter(); var emitter_config = ConfigManager.BuffEmitter.getRow(config.BuffEmitter[i]); emitter.buffs = new int[emitter_config.Buffs.Length]; for (int n = 0; n < emitter_config.Buffs.Length; ++n) { emitter.buffs[n] = emitter_config.Buffs[n]; } emitter.Caster = shooter; emitter.filter = emitter_config.AoeFilter; emitters[i] = emitter; } bullet.InitAoeFile(config.AoeRadius, config.AoeDuration, config.AoeInterval, emitters); } if (config.Buffs != null && config.Buffs.Length > 0) { int[] buffs = new int[config.Buffs.Length]; for (int n = 0; n < config.Buffs.Length; ++n) { buffs[n] = config.Buffs[n]; } bullet.InitBuff(buffs); } bullet.position = shooter.position; AddBullet(bullet); return(bullet); }