Aura.Channel.Skills.Combat.Smash.Use C# (CSharp) Метод

Use() публичный Метод

Handles skill usage.
public Use ( Creature attacker, Skill skill, long targetEntityId ) : CombatSkillResult
attacker Aura.Channel.World.Entities.Creature
skill Skill
targetEntityId long
Результат CombatSkillResult
		public override CombatSkillResult Use(Creature attacker, Skill skill, long targetEntityId)
		{
			// Check target
			var mainTarget = attacker.Region.GetCreature(targetEntityId);
			if (mainTarget == null)
				return CombatSkillResult.InvalidTarget;

			// Check range
			var targetPosition = mainTarget.GetPosition();
			if (!attacker.GetPosition().InRange(targetPosition, attacker.AttackRangeFor(mainTarget)))
				return CombatSkillResult.OutOfRange;

			// Stop movement
			attacker.StopMove();

			// Get targets, incl. splash.
			// Splash happens from r5 onwards, but we'll base it on Var4,
			// which is the splash damage and first != 0 on r5.
			var targets = new HashSet<Creature>() { mainTarget };
			if (skill.RankData.Var4 != 0)
				targets.UnionWith(attacker.GetTargetableCreaturesInCone(mainTarget.GetPosition(), attacker.GetTotalSplashRadius(), attacker.GetTotalSplashAngle()));

			// Counter
			if (Counterattack.Handle(targets, attacker))
				return CombatSkillResult.Okay;

			// Prepare combat actions
			var aAction = new AttackerAction(CombatActionType.HardHit, attacker, targetEntityId);
			aAction.Set(AttackerOptions.Result | AttackerOptions.KnockBackHit2);
			aAction.Stun = StunTime;

			var cap = new CombatActionPack(attacker, skill.Info.Id, aAction);

			// Calculate damage
			var mainDamage = this.GetDamage(attacker, skill);

			foreach (var target in targets)
			{
				// Stop movement
				target.StopMove();

				var tAction = new TargetAction(CombatActionType.TakeHit, target, attacker, skill.Info.Id);
				tAction.Set(TargetOptions.Result | TargetOptions.Smash);

				cap.Add(tAction);

				// Damage
				var damage = mainDamage;

				// Elementals
				damage *= attacker.CalculateElementalDamageMultiplier(target);

				// Splash modifier
				if (target != mainTarget)
					damage *= (skill.RankData.Var4 / 100f);

				// Critical Hit
				var critChance = this.GetCritChance(attacker, target, skill);
				CriticalHit.Handle(attacker, critChance, ref damage, tAction);

				// Subtract target def/prot
				SkillHelper.HandleDefenseProtection(target, ref damage);

				// Conditions
				SkillHelper.HandleConditions(attacker, target, ref damage);

				// Mana Shield
				ManaShield.Handle(target, ref damage, tAction);

				// Heavy Stander
				HeavyStander.Handle(attacker, target, ref damage, tAction);

				// Apply damage
				if (damage > 0)
				{
					target.TakeDamage(tAction.Damage = damage, attacker);
					SkillHelper.HandleInjury(attacker, target, damage);
				}

				// Aggro
				if (target == mainTarget)
					target.Aggro(attacker);

				if (target.IsDead)
					tAction.Set(TargetOptions.FinishingHit | TargetOptions.Finished);

				// Set Stun/Knockback
				target.Stun = tAction.Stun = StunTime;
				target.Stability = Creature.MinStability;

				// Set knockbacked position
				attacker.Shove(target, KnockbackDistance);
			}

			// Response
			Send.SkillUseStun(attacker, skill.Info.Id, AfterUseStun, 1);

			// Update both weapons
			SkillHelper.UpdateWeapon(attacker, mainTarget, ProficiencyGainType.Melee, attacker.RightHand, attacker.LeftHand);

			// Action!
			cap.Handle();

			return CombatSkillResult.Okay;
		}