public CombatSkillResult Use(Creature attacker, Skill skill, long targetEntityId) { if (attacker.IsStunned) return CombatSkillResult.Okay; var target = attacker.Region.GetCreature(targetEntityId); if (target == null) return CombatSkillResult.Okay; if (!attacker.GetPosition().InRange(target.GetPosition(), attacker.AttackRangeFor(target))) return CombatSkillResult.OutOfRange; attacker.StopMove(); var targetPosition = target.StopMove(); var rightWeapon = attacker.Inventory.RightHand; var leftWeapon = attacker.Inventory.LeftHand; var magazine = attacker.Inventory.Magazine; var dualWield = (rightWeapon != null && leftWeapon != null); var maxHits = (byte)(dualWield ? 2 : 1); int prevId = 0; for (byte i = 1; i <= maxHits; ++i) { var weapon = (i == 1 ? rightWeapon : leftWeapon); var cap = new CombatActionPack(attacker, skill.Info.Id); var aAction = new AttackerAction(CombatActionType.Hit, attacker, skill.Info.Id, targetEntityId); var tAction = new TargetAction(CombatActionType.TakeHit, target, attacker, skill.Info.Id); cap.Add(aAction, tAction); cap.Hit = i; cap.MaxHits = maxHits; cap.PrevId = prevId; prevId = cap.Id; aAction.Set(AttackerOptions.Result); if (dualWield) aAction.Set(AttackerOptions.DualWield); var damage = attacker.GetRndDamage(weapon); tAction.Damage = damage; target.TakeDamage(tAction.Damage, attacker); if (!target.IsDead) { target.KnockBack += this.GetKnockBack(weapon) / maxHits; if (target.KnockBack >= 100 && target.Is(RaceStands.KnockBackable)) tAction.Set(tAction.Has(TargetOptions.Critical) ? TargetOptions.KnockDown : TargetOptions.KnockBack); } else { tAction.Set(TargetOptions.FinishingKnockDown); } if (tAction.IsKnockBack) { var newPos = attacker.GetPosition().GetRelative(targetPosition, KnockBackDistance); Position intersection; if (target.Region.Collissions.Find(targetPosition, newPos, out intersection)) newPos = targetPosition.GetRelative(intersection, -50); target.SetPosition(newPos.X, newPos.Y); aAction.Set(AttackerOptions.KnockBackHit2); cap.MaxHits = cap.Hit; } aAction.Stun = this.GetAttackerStun(weapon, tAction.IsKnockBack); tAction.Stun = this.GetTargetStun(weapon, tAction.IsKnockBack); cap.Handle(); if (tAction.IsKnockBack) break; } return CombatSkillResult.Okay; }