public override IEnumerable <TickTimer> Main() { //StartCooldown(WaitSeconds(10f)); var projectile = new Projectile(this, 74636, User.Position); projectile.Timeout = WaitSeconds(0.5f); projectile.OnCollision = (hit) => { GeneratePrimaryResource(15f); _setupReturnProjectile(hit.Position); AttackPayload attack = new AttackPayload(this); attack.SetSingleTarget(hit); attack.AddWeaponDamage(1.00f, DamageType.Physical); attack.OnHit = (hitPayload) => { // GET OVER HERE Knockback(hitPayload.Target, -25f, 1f, -0.03f); }; attack.Apply(); projectile.Destroy(); }; projectile.OnTimeout = () => { _setupReturnProjectile(projectile.Position); }; projectile.Launch(TargetPosition, 1.9f); User.AddRopeEffect(79402, projectile); yield break; }
public void WeaponDamage(Actor target, float damageMultiplier, DamageType damageType) { AttackPayload payload = new AttackPayload(this); payload.SetSingleTarget(target); payload.AddWeaponDamage(damageMultiplier, damageType); payload.Apply(); }
public void Damage(Actor target, float minDamage, float damageDelta, DamageType damageType) { AttackPayload payload = new AttackPayload(this); payload.SetSingleTarget(target); payload.AddDamage(minDamage, damageDelta, damageType); payload.Apply(); }
public override bool Update() { if (base.Update()) { return(true); } if (_damageTimer == null || _damageTimer.TimedOut) { _damageTimer = WaitSeconds(_damageRate); AttackPayload attack = new AttackPayload(this); attack.SetSingleTarget(Target); attack.AddWeaponDamage(ScriptFormula(6) * _damageRate, DamageType.Physical); attack.AutomaticHitEffects = false; attack.Apply(); } return(false); }
public override bool Update() { if (base.Update()) return true; if (_damageTimer == null || _damageTimer.TimedOut) { _damageTimer = WaitSeconds(_damageRate); AttackPayload attack = new AttackPayload(this); attack.SetSingleTarget(Target); attack.AddWeaponDamage(ScriptFormula(6) * _damageRate, DamageType.Physical); attack.AutomaticHitEffects = false; attack.Apply(); } return false; }
public override bool Update() { if (base.Update()) return true; if (_damageTimer == null || _damageTimer.TimedOut) { _damageTimer = WaitSeconds(_damageRate); UsePrimaryResource(ScriptFormula(0)); //testing in this area for resource. if (Rune_E > 0) { WeaponDamage(GetEnemiesInRadius(User.Position, ScriptFormula(21)), ScriptFormula(19), DamageType.Fire); } else if (Rune_A > 0) { AttackPayload attack = new AttackPayload(this); attack.SetSingleTarget(Target); attack.AddWeaponDamage(ScriptFormula(15), DamageType.Fire); attack.Apply(); } else if (Rune_B > 0) { AttackPayload attack = new AttackPayload(this); attack.SetSingleTarget(Target); attack.AddWeaponDamage(ScriptFormula(18), DamageType.Fire); attack.Apply(); } else if (Rune_C > 0) { AttackPayload attack = new AttackPayload(this); attack.SetSingleTarget(Target); attack.AddWeaponDamage(ScriptFormula(12), DamageType.Poison); attack.OnHit = HitPayload => { }; attack.Apply(); } else { AttackPayload attack = new AttackPayload(this); attack.SetSingleTarget(Target); attack.AddWeaponDamage(ScriptFormula(1), DamageType.Fire); attack.OnHit = HitPayload => { //Rune_D -> Healing }; attack.Apply(); } } return false; }
public override IEnumerable<TickTimer> Main() { StartCooldown(EvalTag(PowerKeys.CooldownTime)); UsePrimaryResource(EvalTag(PowerKeys.ResourceCost)); if (Rune_A > 0) { Vector3D inFrontOfUser = PowerMath.TranslateDirection2D(User.Position, TargetPosition, User.Position, -20f); Vector3D[] projDestinations = PowerMath.GenerateSpreadPositions(User.Position, TargetPosition, 10f, 3); var BearProj1 = new Projectile(this, RuneSelect(74056, 105501, 105543, 105463, 105969, 105812), inFrontOfUser); BearProj1.Position.Z -= 3f; BearProj1.OnCollision = (hit) => { WeaponDamage(hit, ScriptFormula(4), DamageType.Poison); }; BearProj1.Launch(projDestinations[1], ScriptFormula(19)); yield return WaitSeconds(0.5f); var BearProj2 = new Projectile(this, RuneSelect(74056, 105501, 105543, 105463, 105969, 105812), inFrontOfUser); BearProj2.Position.Z -= 3f; BearProj2.OnCollision = (hit) => { WeaponDamage(hit, ScriptFormula(4), DamageType.Poison); }; BearProj2.Launch(projDestinations[0], ScriptFormula(19)); yield return WaitSeconds(0.5f); var BearProj3 = new Projectile(this, RuneSelect(74056, 105501, 105543, 105463, 105969, 105812), inFrontOfUser); BearProj3.Position.Z -= 3f; BearProj3.OnCollision = (hit) => { WeaponDamage(hit, ScriptFormula(4), DamageType.Poison); }; BearProj3.Launch(projDestinations[2], ScriptFormula(19)); } else if (Rune_B > 0) { Vector3D inFrontOfUser = PowerMath.TranslateDirection2D(User.Position, TargetPosition, User.Position, 3f); Vector3D[] projDestinations = PowerMath.GenerateSpreadPositions(User.Position, TargetPosition, ScriptFormula(10), (int)ScriptFormula(3)); for (int i = 1; i < projDestinations.Length; i++) { var multiproj = new Projectile(this, RuneSelect(74056, 105501, 105543, 105463, 105969, 105812), inFrontOfUser); multiproj.Position.Z -= 3f; multiproj.OnCollision = (hit) => { WeaponDamage(hit, ScriptFormula(4), DamageType.Poison); }; multiproj.Launch(projDestinations[i], ScriptFormula(1)); } } else if (Rune_D > 0) { Vector3D inFrontOfUser = PowerMath.TranslateDirection2D(User.Position, TargetPosition, User.Position, 3f); var proj = new Projectile(this, RuneSelect(74056, 105501, 105543, 105463, 105969, 105812), inFrontOfUser); proj.Position.Z -= 3f; proj.Launch(TargetPosition, ScriptFormula(1)); proj.OnCollision = (hit) => { AttackPayload attack = new AttackPayload(this); attack.SetSingleTarget(hit); attack.AddWeaponDamage(ScriptFormula(4), DamageType.Poison); attack.Apply(); attack.OnDeath = DeathPayload => { Vector3D inFrontOfUser2 = PowerMath.TranslateDirection2D(User.Position, TargetPosition, User.Position, 22f); var proj2 = new Projectile(this, RuneSelect(74056, 105501, 105543, 105463, 105969, 105812), inFrontOfUser2); proj.Launch(TargetPosition, ScriptFormula(1)); //TODO:need this stuff. //zombie new distance (SF(13)) //zombie speed (SF(14)) //New zombie search range (SF(15)) //new zombie chance (SF18) //max new zombie per projectile (SF24) //damage scalar -> SF31 //damage reduction per zombie -> SF30 }; }; } else if (Rune_E > 0) { Vector3D inFrontOfUser = PowerMath.TranslateDirection2D(User.Position, TargetPosition, User.Position, 3f); var proj = new Projectile(this, RuneSelect(74056, 105501, 105543, 105463, 105969, 105812), inFrontOfUser); proj.Position.Z -= 3f; proj.OnCollision = (hit) => { WeaponDamage(GetEnemiesInRadius(hit.Position, ScriptFormula(11)), ScriptFormula(4), DamageType.Fire); }; proj.Launch(TargetPosition, ScriptFormula(7)); } else { Vector3D inFrontOfUser = PowerMath.TranslateDirection2D(User.Position, TargetPosition, User.Position, 3f); var proj = new Projectile(this, RuneSelect(74056, 105501, 105543, 105463, 105969, 105812), inFrontOfUser); proj.Position.Z -= 3f; proj.Launch(TargetPosition, ScriptFormula(1)); if (Rune_C > 0) { var Puddle = SpawnEffect(105502, proj.Position, 0, WaitSeconds(ScriptFormula(17))); Puddle.UpdateDelay = 0.5f; //somehow play this more often? Puddle.OnUpdate = () => { AttackPayload attack = new AttackPayload(this); attack.Targets = GetEnemiesInRadius(proj.Position, ScriptFormula(8)); attack.AddWeaponDamage(ScriptFormula(6), DamageType.Poison); attack.Apply(); }; } proj.OnCollision = (hit) => { WeaponDamage(hit, ScriptFormula(4), DamageType.Poison); }; } yield break; }
public override bool Update() { if (base.Update()) return true; if (_damageTimer == null || _damageTimer.TimedOut) { _damageTimer = WaitSeconds(_damageRate); if (Rune_D > 0) { GeneratePrimaryResource(ScriptFormula(3)); } AttackPayload attack = new AttackPayload(this); attack.SetSingleTarget(Target); attack.AddWeaponDamage((ScriptFormula(0) / ScriptFormula(1)), DamageType.Holy); attack.AutomaticHitEffects = false; attack.OnHit = hit => { if (Rune_A > 0) { //45% of damage healed back to user float healMe = ScriptFormula(2) * hit.TotalDamage; //User.Attributes[GameAttribute.Hitpoints_Granted] = healMe; //User.Attributes.BroadcastChangedIfRevealed(); } if (Rune_C > 0) { //DebuffSlowed Target AddBuff(Target, new DebuffSlowed(ScriptFormula(5), WaitSeconds(ScriptFormula(1)))); } }; attack.Apply(); } return false; }
public override bool Update() { if (base.Update()) return true; if (_damageTimer == null || _damageTimer.TimedOut) { _damageTimer = WaitSeconds(_damageRate); AttackPayload attack = new AttackPayload(this); attack.SetSingleTarget(Target); attack.AddWeaponDamage(ScriptFormula(0), Rune_A > 0 ? DamageType.Fire : DamageType.Poison); attack.AutomaticHitEffects = false; attack.Apply(); } /*while (_jumpRate > ScriptFormula(4)) { if (_jumpTimer == null || _jumpTimer.TimedOut) { _jumpTimer = WaitSeconds(_jumpRate); //swarm jump radius var newTarget = GetEnemiesInRadius(Target.Position, ScriptFormula(2)).GetClosestTo(Target.Position); while (newTarget != null) { //Target.AddComplexEffect(106839, newTarget); AddBuff(newTarget, new LocustSwarmer(WaitSeconds(ScriptFormula(1)))); } _jumpRate *= 0.9f; //delta = Swarm Jump Time Delta } }*/ return false; }
public override IEnumerable<TickTimer> Main() { //StartCooldown(WaitSeconds(10f)); var projectile = new Projectile(this, 74636, User.Position); projectile.Timeout = WaitSeconds(0.5f); projectile.OnCollision = (hit) => { GeneratePrimaryResource(15f); _setupReturnProjectile(hit.Position); AttackPayload attack = new AttackPayload(this); attack.SetSingleTarget(hit); attack.AddWeaponDamage(1.00f, DamageType.Physical); attack.OnHit = (hitPayload) => { // GET OVER HERE Knockback(hitPayload.Target, -25f, 1f, -0.03f); }; attack.Apply(); projectile.Destroy(); }; projectile.OnTimeout = () => { _setupReturnProjectile(projectile.Position); }; projectile.Launch(TargetPosition, 1.9f); User.AddRopeEffect(79402, projectile); yield break; }
public override void OnPayload(Payload payload) { //TODO:Rune_E -> Whenever you cast a spell that critically hits, you also shock a nearby enemy for 319% weapon damage as Lightning. if (payload.Target == Target && payload is HitPayload) { //projectile? ScriptFormula(3) is speed. AttackPayload attack = new AttackPayload(this); attack.SetSingleTarget(payload.Context.User); attack.AddWeaponDamage(ScriptFormula(1), DamageType.Lightning); attack.Apply(); if (Rune_B > 0) { AddBuff(User, new IndigoBuff()); AddBuff(User, new MovementBuff(ScriptFormula(14), WaitSeconds(ScriptFormula(20)))); } if (Rune_C > 0) { AddBuff(User, new TeslaBuff()); } } }
public override IEnumerable<TickTimer> Main() { // Rune_D resource mod calculated in SF_19 UsePrimaryResource(ScriptFormula(19)); AttackPayload attack = new AttackPayload(this); if (Rune_B > 0) { attack.Targets = GetEnemiesInRadius(User.Position, ScriptFormula(7)); attack.AddWeaponDamage(ScriptFormula(6), DamageType.Cold); // TODO: chill debuff? } else { // Select first actor beam hits, or make max beam length Vector3D attackPos; var beamTargets = GetEnemiesInBeamDirection(User.Position, TargetPosition, MaxBeamLength, ScriptFormula(10)); if (beamTargets.Actors.Count > 0) { Actor target = beamTargets.GetClosestTo(User.Position); attackPos = target.Position + new Vector3D(0, 0, 5f); // fix height for beam end attack.SetSingleTarget(target); } else { attackPos = _calcBeamEnd(MaxBeamLength); } // update _beamEnd actor _beamEnd.MoveSnapped(attackPos, 0f); // all runes other than B seem to share the same weapon damage. attack.AddWeaponDamage(ScriptFormula(0), DamageType.Cold); if (Rune_A > 0) { // TODO: damage time amp attack.OnHit = hit => { AddBuff(hit.Target, new DebuffChilled(0.3f, WaitSeconds(0.5f))); //slow 40%, atk spd 30% //this does attack and movement, but doesnt do the difference which is needed. }; } else if (Rune_C > 0) { attack.OnHit = hit => { AddBuff(hit.Target, new DebuffChilled(ScriptFormula(14), WaitSeconds(ScriptFormula(4)))); //slow 40%, atk spd 30% //Atk Speed Reduction % {SF(24)} to monster //AddBuff(actor, new AtkSpeedDebuff //Dmg Reduction {SF(25)} //targets attack speed by 30% for 5 seconds }; } else { attack.OnHit = hit => { AddBuff(hit.Target, new DebuffChilled(0.3f, WaitSeconds(0.5f))); //slow 40%, atk spd 30% //this does attack and movement, but doesnt do the difference which is needed. }; } if (Rune_E > 0) { attack.OnDeath = death => { var icepool = SpawnEffect(148634, death.Target.Position, 0, WaitSeconds(ScriptFormula(8))); icepool.PlayEffectGroup(149879); icepool.UpdateDelay = 1f; icepool.OnUpdate = () => { WeaponDamage(GetEnemiesInRadius(icepool.Position, 3f), ScriptFormula(3), DamageType.Cold); // TODO: chilled buff? }; }; } } attack.Apply(); yield break; }
public override IEnumerable<TickTimer> Main() { StartCooldown(EvalTag(PowerKeys.CooldownTime)); UsePrimaryResource(EvalTag(PowerKeys.ResourceCost)); var proj = new Projectile(this, RuneSelect(220527, 222102, 222115, 222128, 220527, 222141), User.Position); proj.Position.Z += 5f; // fix height proj.OnCollision = (hit) => { hit.PlayEffectGroup(RuneSelect(221164, 222107, 222120, 222133, 221164, 222146)); AttackPayload attack = new AttackPayload(this); attack.SetSingleTarget(hit); attack.AddWeaponDamage(ScriptFormula(0), DamageType.Physical); attack.OnHit = (HitPayload) => { //if (HitPayload.IsCriticalHit) //{ // if (Rune_E > 0) // { // WeaponDamage(HitPayload.Target, ScriptFormula(13), DamageType.Physical); // } //} if (Rune_A > 0) { //Nothing goes here. } else { if (Rune_B > 0) { Knockback(User.Position, hit, ScriptFormula(4)); AddBuff(hit, new DebuffStunned(WaitSeconds(ScriptFormula(6)))); } if (Rune_C > 0) { AddBuff(hit, new addsDOTDamage()); } proj.Destroy(); } }; attack.Apply(); }; proj.Launch(TargetPosition, ScriptFormula(2)); if (Rune_D > 0) { SpawnEffect(222156, User.Position); //User.PlayEffectGroup(222155); WeaponDamage(GetEnemiesInRadius(User.Position, ScriptFormula(11)), ScriptFormula(12), DamageType.Physical); } yield return WaitSeconds(1f); }
public override bool Update() { if (base.Update()) return true; if (_damageTimer == null || _damageTimer.TimedOut) { _damageTimer = WaitSeconds(_damageRate); if (Rune_D > 0) { //GeneratePrimaryResource(ScriptFormula(3)); } AttackPayload attack = new AttackPayload(this); attack.SetSingleTarget(Target); attack.AddWeaponDamage((ScriptFormula(0) / ScriptFormula(1)), DamageType.Holy); attack.OnHit = hit => { if (Rune_A > 0) { //45% of damage healed back to user } if (Rune_C > 0) { //DebuffSlowed Target } }; attack.Apply(); } return false; }
public override void OnPayload(Payload payload) { if (payload.Target == Target && payload is HitPayload) { //projectile? ScriptFormula(3) is speed. AttackPayload attack = new AttackPayload(this); attack.SetSingleTarget(payload.Context.User); attack.AddWeaponDamage(ScriptFormula(1), DamageType.Lightning); attack.Apply(); if (Rune_B > 0) { AddBuff(User, new IndigoBuff()); AddBuff(User, new MovementBuff(ScriptFormula(14), WaitSeconds(ScriptFormula(20)))); } if (Rune_C > 0) { AddBuff(User, new TeslaBuff()); } } }
public override IEnumerable<TickTimer> Main() { //StartCooldown(WaitSeconds(10f)); if (Rune_B > 0) { Vector3D[] projDestinations = PowerMath.GenerateSpreadPositions(User.Position, TargetPosition, ScriptFormula(9), (int)ScriptFormula(11)); for (int i = 0; i < projDestinations.Length; i++) { var proj = new Projectile(this, 74636, User.Position); proj.Timeout = WaitSeconds(0.5f); proj.OnCollision = (hit) => { GeneratePrimaryResource(15f); _setupReturnProjectile(hit.Position); AttackPayload attack = new AttackPayload(this); attack.SetSingleTarget(hit); attack.AddWeaponDamage(ScriptFormula(0), DamageType.Physical); attack.OnHit = (hitPayload) => { hitPayload.Target.PlayEffectGroup(79420); Knockback(hitPayload.Target, -25f, ScriptFormula(3), ScriptFormula(4)); }; attack.Apply(); proj.Destroy(); }; proj.OnTimeout = () => { _setupReturnProjectile(proj.Position); }; proj.Launch(projDestinations[i], ScriptFormula(8)); User.AddRopeEffect(79402, proj); } } else if (Rune_A > 0) { //Straight line but brings all the zombies in that line back to you. } else { var projectile = new Projectile(this, 74636, User.Position); projectile.Timeout = WaitSeconds(0.5f); projectile.OnCollision = (hit) => { GeneratePrimaryResource(ScriptFormula(12) + ScriptFormula(13)); _setupReturnProjectile(hit.Position); AttackPayload attack = new AttackPayload(this); attack.SetSingleTarget(hit); attack.AddWeaponDamage(ScriptFormula(0), DamageType.Physical); attack.OnHit = (hitPayload) => { // GET OVER HERE //unknown on magnitude/knockback offset? hitPayload.Target.PlayEffectGroup(79420); Knockback(hitPayload.Target, -25f, ScriptFormula(3), ScriptFormula(4)); }; attack.Apply(); projectile.Destroy(); }; projectile.OnTimeout = () => { _setupReturnProjectile(projectile.Position); }; projectile.Launch(TargetPosition, ScriptFormula(8)); User.AddRopeEffect(79402, projectile); } yield break; }
public override IEnumerable<TickTimer> Main() { StartCooldown(EvalTag(PowerKeys.CooldownTime)); bool hitAnything = false; if (Rune_B > 0) { Vector3D[] projDestinations = PowerMath.GenerateSpreadPositions(User.Position, TargetPosition, ScriptFormula(9) / 5f, (int)ScriptFormula(11)); for (int i = 0; i < projDestinations.Length; i++) { var proj = new Projectile(this, 161891, User.Position); proj.Scale = 3f; proj.Timeout = WaitSeconds(0.5f); proj.OnCollision = (hit) => { hitAnything = true; _setupReturnProjectile(hit.Position); AttackPayload attack = new AttackPayload(this); attack.SetSingleTarget(hit); attack.AddWeaponDamage(ScriptFormula(0), DamageType.Physical); attack.OnHit = (hitPayload) => { hitPayload.Target.PlayEffectGroup(79420); Knockback(hitPayload.Target, -25f, ScriptFormula(3), ScriptFormula(4)); }; attack.Apply(); proj.Destroy(); }; proj.OnTimeout = () => { _setupReturnProjectile(proj.Position); }; proj.Launch(projDestinations[i], ScriptFormula(8)); User.AddRopeEffect(79402, proj); } } else if (Rune_E > 0) { Vector3D[] projDestinations = PowerMath.GenerateSpreadPositions(User.Position, TargetPosition, ScriptFormula(9) / 5f, (int)ScriptFormula(11)); for (int i = 0; i < projDestinations.Length; i++) { var proj = new Projectile(this, 161894, User.Position); proj.Scale = 3f; proj.Timeout = WaitSeconds(0.5f); proj.OnCollision = (hit) => { hitAnything = true; _setupReturnProjectile(hit.Position); AttackPayload attack = new AttackPayload(this); attack.SetSingleTarget(hit); attack.AddWeaponDamage(ScriptFormula(0), DamageType.Physical); attack.OnHit = (hitPayload) => { hitPayload.Target.PlayEffectGroup(79420); Knockback(hitPayload.Target, 25f, ScriptFormula(3), ScriptFormula(4)); }; attack.Apply(); proj.Destroy(); }; proj.OnTimeout = () => { _setupReturnProjectile(proj.Position); }; proj.Launch(projDestinations[i], ScriptFormula(8)); User.AddRopeEffect(79402, proj); } } else if (Rune_A > 0) { var projectile = new Projectile(this, 161890, User.Position); projectile.Scale = 3f; projectile.Timeout = WaitSeconds(0.5f); projectile.OnCollision = (hit) => { hitAnything = true; _setupReturnProjectile(hit.Position); AttackPayload attack = new AttackPayload(this); attack.SetSingleTarget(hit); attack.AddWeaponDamage(ScriptFormula(0), DamageType.Physical); attack.OnHit = (hitPayload) => { for (int i = 0; i < ScriptFormula(17); ++i) { hitPayload.Target.PlayEffectGroup(79420); Knockback(hitPayload.Target, -25f, ScriptFormula(3), ScriptFormula(4)); } }; attack.Apply(); }; projectile.OnTimeout = () => { _setupReturnProjectile(projectile.Position); }; projectile.Launch(TargetPosition, ScriptFormula(8)); User.AddRopeEffect(79402, projectile); } else { var projectile = new Projectile(this, RuneSelect(74636, -1, -1, 161892, 161893, -1), User.Position); projectile.Scale = 3f; projectile.Timeout = WaitSeconds(0.5f); projectile.OnCollision = (hit) => { hitAnything = true; _setupReturnProjectile(hit.Position); AttackPayload attack = new AttackPayload(this); attack.SetSingleTarget(hit); attack.AddWeaponDamage(ScriptFormula(0), DamageType.Physical); attack.OnHit = (hitPayload) => { // GET OVER HERE //unknown on magnitude/knockback offset? hitPayload.Target.PlayEffectGroup(79420); Knockback(hitPayload.Target, -25f, ScriptFormula(3), ScriptFormula(4)); if (Rune_C > 0) { float healMe = ScriptFormula(10) * hitPayload.TotalDamage; //User.Attributes[GameAttribute.Hitpoints_Granted] = healMe; //User.Attributes.BroadcastChangedIfRevealed(); } }; attack.Apply(); projectile.Destroy(); }; projectile.OnTimeout = () => { _setupReturnProjectile(projectile.Position); }; projectile.Launch(TargetPosition, ScriptFormula(8)); User.AddRopeEffect(79402, projectile); } if (hitAnything) GeneratePrimaryResource(EvalTag(PowerKeys.ResourceGainedOnFirstHit)); yield break; }
public override bool Update() { if (base.Update()) { return true; } if (base.Update()) return true; if (_damageTimer == null || _damageTimer.TimedOut) { _damageTimer = WaitSeconds(_damageRate); AttackPayload attack = new AttackPayload(this); attack.SetSingleTarget(Target); attack.AddWeaponDamage(ScriptFormula(4), DamageType.Poison); attack.Apply(); } return false; }