protected void AddTargetedProjectile(string name, AttackableUnit target, bool serverOnly = false) { var record = SpellRecord.GetSpell(name); var position = new Vector3(Owner.Position.X, Owner.Position.Y, 100); var casterPosition = new Vector3(Owner.Position.X, Owner.Position.Y, 100); var angle = Geo.GetAngle(Owner.Position, target.Position); var direction = Geo.GetDirection(angle); var velocity = new Vector3(1, 1, 1) * 100; var startPoint = new Vector3(Owner.Position.X, Owner.Position.Y, 100); var endPoint = new Vector3(target.Position.X, target.Position.Y, 100); var targetedProjectile = new TargetedProjectile(Owner.Game.NetIdProvider.PopNextNetId(), Owner, target, startPoint.ToVector2(), SpellRecord.MissileSpeed, OnProjectileReach); Owner.Game.AddUnitToTeam(targetedProjectile, Owner.Team.Id); Owner.Game.Map.AddUnit(targetedProjectile); if (!serverOnly) { var castInfo = Spell.GetCastInformations(position, endPoint, name, targetedProjectile.NetId, new AttackableUnit[] { target }); Owner.Game.Send(new SpawnProjectileMessage(targetedProjectile.NetId, position, casterPosition, direction.ToVector3(), velocity, startPoint, endPoint, casterPosition, 0, record.MissileSpeed, 1f, 1f, 1f, false, castInfo)); } }
private void OnReach(AttackableUnit target, Projectile projectile) { if (Target.Alive) { InflictDamages(); } Unit.GetAttackManager <RangedManager>().RemoveProjectile(Projectile); Projectile = null; }
private bool CheckSpellCastType(Unit caster, Spell spell, SpellData spellData) { switch (spellData.spellCastType) { case SpellCastType.Casted: if (caster.Character.SpellCast.HasCast) { return(false); } else { caster.Character.SpellCast = new SpellCast(spell, spellData, caster, caster.Character.target); ApplyGlobalCooldown(caster, spell, spellData); caster.Animator.SetBool("Casting", true); return(true); } case SpellCastType.Instant: if (caster.Character.SpellCast.HasCast) { return(false); } else { if (spellData.spellProjectileName != null) { GameObject effect = Instantiate(Resources.Load("Prefabs/Spells/" + spellData.spellProjectileName), caster.castPoint != null ? caster.castPoint.position : new Vector3(caster.transform.position.x, caster.transform.position.y + caster.GetComponent <Collider2D>().bounds.size.y * 3 / 4, caster.transform.position.z), Quaternion.identity) as GameObject; TargetedProjectile projectile = effect.GetComponent <TargetedProjectile>(); projectile.Initialize(this, caster, caster.character.target, spell); effect.transform.parent = Effects.transform; ApplyGlobalCooldown(caster, spell, spellData); spell.spellCooldown.Apply(); caster.Animator.SetTrigger("InstantAttack"); GameObject skillUseEvent = MonoBehaviour.Instantiate(Resources.Load("Prefabs/UI/SkillUseEvent")) as GameObject; skillUseEvent.GetComponent <SkillUseUIEvent>().Initialize(spellData, caster, PlayerInterface); return(false); } ApplyGlobalCooldown(caster, spell, spellData); spell.spellCooldown.Apply(); caster.Animator.SetTrigger("InstantAttack"); return(true); } } return(false); }
private void CastProjectile() { SpellRecord basicAttackRecord = Unit.Record.BasicAttack; if (basicAttackRecord == null) { logger.Write("No basic attack data for unit " + Unit.Name, MessageState.WARNING); return; } if (basicAttackRecord.MissileSpeed == 0) { logger.Write("We wont spawn a projectile with 0 speed!", MessageState.WARNING); return; } this.Projectile = new TargetedProjectile(Unit.Game.NetIdProvider.PopNextNetId(), Unit, Target, Unit.Position, basicAttackRecord.MissileSpeed, OnReach); Unit.GetAttackManager <RangedManager>().AddProjectile(Projectile); }
public bool SpellCastFinished(SpellCast spellCast) { SpellData spellData = SpellLibrary.GetSpell(spellCast.spell.id); Spell spell = spellCast.spell; Unit caster = spellCast.caster; Unit target = spellCast.target; if (spellData.effectName != null) { GameObject effect = Instantiate(Resources.Load("Prefabs/Spells/" + spellData.effectName), new Vector3(caster.transform.position.x, caster.transform.position.y, caster.transform.position.z), caster.transform.rotation) as GameObject; effect.transform.parent = Effects.transform; } if (spellData.castSoundName != null) { AudioClip audio = Resources.Load <AudioClip>(spellData.castSoundName); AudioSource.PlayClipAtPoint(audio, caster.transform.position); } if (spellData.spellProjectileName != null) { GameObject effect = Instantiate(Resources.Load("Prefabs/Spells/" + spellData.spellProjectileName), caster.castPoint != null ? caster.castPoint.position : new Vector3(caster.transform.position.x, caster.transform.position.y + caster.GetComponent <Collider2D>().bounds.size.y * 3 / 4, caster.transform.position.z), Quaternion.identity) as GameObject; TargetedProjectile projectile = effect.GetComponent <TargetedProjectile>(); projectile.Initialize(this, caster, target, spell); effect.transform.parent = Effects.transform; caster.Animator.SetTrigger("InstantAttack"); caster.Animator.SetBool("Casting", false); return(true); } if (spellData.hitSoundName != null) { AudioClip audio = Resources.Load <AudioClip>(spellData.hitSoundName); AudioSource.PlayClipAtPoint(audio, caster.transform.position); } ApplySpell(caster, target, spell, spellData); caster.Animator.SetTrigger("InstantAttack"); caster.Animator.SetBool("Casting", false); return(true); }
public void RemoveProjectile(TargetedProjectile projectile) { this.Projectiles.Remove(projectile); }
public void AddProjectile(TargetedProjectile projectile) { this.Projectiles.Add(projectile); }