本文整理汇总了C#中Aura.Channel.World.Entities.Creature.CanAttack方法的典型用法代码示例。如果您正苦于以下问题:C# Creature.CanAttack方法的具体用法?C# Creature.CanAttack怎么用?C# Creature.CanAttack使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Aura.Channel.World.Entities.Creature
的用法示例。
在下文中一共展示了Creature.CanAttack方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: UseSkillOnTarget
/// <summary>
/// Bolt specific use code.
/// </summary>
/// <param name="attacker"></param>
/// <param name="skill"></param>
/// <param name="target"></param>
protected override void UseSkillOnTarget(Creature attacker, Skill skill, Creature mainTarget)
{
// Create actions
var aAction = new AttackerAction(CombatActionType.RangeHit, attacker, skill.Info.Id, mainTarget.EntityId);
aAction.Set(AttackerOptions.Result);
var cap = new CombatActionPack(attacker, skill.Info.Id, aAction);
var targets = new List<Creature>();
targets.Add(mainTarget);
targets.AddRange(mainTarget.Region.GetCreaturesInRange(mainTarget.GetPosition(), SplashRange).Where(a => a != mainTarget && attacker.CanTarget(a) && attacker.CanAttack(a)));
// Damage
var damage = this.GetDamage(attacker, skill);
var max = Math.Min(targets.Count, skill.Stacks);
for (int i = 0; i < max; ++i)
{
var target = targets[i];
var targetDamage = damage;
target.StopMove();
var tAction = new TargetAction(CombatActionType.TakeHit, target, attacker, skill.Info.Id);
tAction.Set(TargetOptions.Result);
tAction.Stun = TargetStun;
// Full damage for the first target, -10% for every subsequent one.
targetDamage -= (targetDamage * 0.1f) * i;
// Reduce damage
var maxDamage = damage; //Damage without Defense and Protection
// Reduce damage
Defense.Handle(aAction, tAction);
SkillHelper.HandleMagicDefenseProtection(target, ref targetDamage);
ManaShield.Handle(target, ref targetDamage, tAction, maxDamage, true);
// Deal damage
if (targetDamage > 0)
target.TakeDamage(tAction.Damage = targetDamage, attacker);
if (target == mainTarget)
target.Aggro(attacker);
// Death/Knockback
this.HandleKnockBack(attacker, target, tAction);
cap.Add(tAction);
}
// Override stun set by defense
aAction.Stun = AttackerStun;
Send.Effect(attacker, Effect.UseMagic, EffectSkillName);
Send.SkillUseStun(attacker, skill.Info.Id, aAction.Stun, 1);
this.BeforeHandlingPack(attacker, skill);
cap.Handle();
}
示例2: GetTargetableCreaturesInRange
/// <summary>
/// Returns targetable creatures in given range of prop.
/// Owner of the prop and creatures he can't target are excluded.
/// </summary>
/// <param name="owner">Owner of the prop, who is excluded and used as reference for CanTarget (null to ignore).</param>
/// <param name="range"></param>
/// <returns></returns>
public ICollection<Creature> GetTargetableCreaturesInRange(Creature owner, int range)
{
var pos = this.GetPosition();
var targetable = this.Region.GetCreatures(target =>
{
var targetPos = target.GetPosition();
return target != owner // Exclude owner
&& (owner == null || owner.CanTarget(target) && owner.CanAttack(target)) // Check targetability
&& !target.IsDead // Check if target's alive (in case owner is null)
&& !target.Has(CreatureStates.NamedNpc) // Don't hit NamedNpcs (in case owner is null)
&& targetPos.InRange(pos, range) // Check range
&& !this.Region.Collisions.Any(pos, targetPos) // Check collisions between entities
&& !target.Conditions.Has(ConditionsA.Invisible); // Check visiblility (GM)
});
return targetable;
}
示例3: Use
/// <summary>
/// Handles attack.
/// </summary>
/// <param name="attacker">The creature attacking.</param>
/// <param name="skill">The skill being used.</param>
/// <param name="targetEntityId">The entity id of the target.</param>
/// <returns></returns>
public CombatSkillResult Use(Creature attacker, Skill skill, long targetEntityId)
{
var target = attacker.Region.GetCreature(targetEntityId);
if (target == null)
return CombatSkillResult.Okay;
if (target.IsNotReadyToBeHit)
return CombatSkillResult.Okay;
if ((attacker.IsStunned || attacker.IsOnAttackDelay) && attacker.InterceptingSkillId == SkillId.None)
return CombatSkillResult.Okay;
var attackerPosition = attacker.GetPosition();
var targetPosition = target.GetPosition();
if (!attacker.IgnoreAttackRange &&
(!attackerPosition.InRange(targetPosition, attacker.AttackRangeFor(target))))
{ return CombatSkillResult.OutOfRange; }
if (!attacker.IgnoreAttackRange &&
(attacker.Region.Collisions.Any(attackerPosition, targetPosition) // Check collisions between position
|| target.Conditions.Has(ConditionsA.Invisible))) // Check visiblility (GM)
{ return CombatSkillResult.Okay; }
attacker.IgnoreAttackRange = false;
//Against Smash
Skill smash = target.Skills.Get(SkillId.Smash);
if (smash != null && target.Skills.IsReady(SkillId.Smash) && attacker.CanAttack(target))
attacker.InterceptingSkillId = SkillId.Smash;
var rightWeapon = attacker.RightHand;
var leftWeapon = attacker.Inventory.LeftHand;
var dualWield = (rightWeapon != null && leftWeapon != null && leftWeapon.Data.WeaponType != 0 && (leftWeapon.HasTag("/weapon/edged/") || leftWeapon.HasTag("/weapon/blunt/")));
var staminaUsage = (rightWeapon != null && rightWeapon.Data.StaminaUsage != 0 ? rightWeapon.Data.StaminaUsage : 0.7f) + (dualWield ? leftWeapon.Data.StaminaUsage : 0f);
var lowStamina = false;
if (attacker.Stamina < staminaUsage)
{
lowStamina = true;
Send.Notice(attacker, Localization.Get("Your stamina is too low to attack properly!"));
}
attacker.Stamina -= staminaUsage;
Send.StatUpdate(attacker, StatUpdateType.Private, Stat.Stamina);
// Against Combat Mastery
Skill combatMastery = target.Skills.Get(SkillId.CombatMastery);
var simultaneousAttackStun = 0;
if (attacker.InterceptingSkillId != SkillId.CombatMastery && target.InterceptingSkillId != SkillId.CombatMastery)
{
if (combatMastery != null && (target.Skills.ActiveSkill == null || target.Skills.ActiveSkill == combatMastery || target.Skills.IsReady(SkillId.FinalHit)) && target.IsInBattleStance && target.Target == attacker && target.AttemptingAttack && (!target.IsStunned || target.IsKnockedDown) && attacker.CanAttack(target))
{
var attackerStunTime = CombatMastery.GetAttackerStun(attacker, attacker.RightHand, false);
var targetStunTime = CombatMastery.GetAttackerStun(target, target.Inventory.RightHand, false);
if ((target.LastKnockedBackBy == attacker && target.KnockDownTime > attacker.KnockDownTime &&
target.KnockDownTime.AddMilliseconds(targetStunTime) < DateTime.Now //If last knocked down within the time it takes for you to finish attacking.
|| attackerStunTime > targetStunTime &&
!Math2.Probability(((2725 - attackerStunTime) / 2500) * 100) //Probability in percentage that you will not lose. 2725 is 2500 (Slowest stun) + 225 (Fastest stun divided by two so that the fastest stun isn't 100%)
&& !(attacker.LastKnockedBackBy == target && attacker.KnockDownTime > target.KnockDownTime && attacker.KnockDownTime.AddMilliseconds(attackerStunTime) < DateTime.Now)))
{
if (target.CanAttack(attacker))
{
target.InterceptingSkillId = SkillId.CombatMastery;
target.IgnoreAttackRange = true;
var skillHandler = ChannelServer.Instance.SkillManager.GetHandler<ICombatSkill>(combatMastery.Info.Id);
if (skillHandler == null)
{
Log.Error("CombatMastery.Use: Target's skill handler not found for '{0}'.", combatMastery.Info.Id);
return CombatSkillResult.Okay;
}
skillHandler.Use(target, combatMastery, attacker.EntityId);
return CombatSkillResult.Okay;
}
}
else
{
if (Math2.Probability(((2725 - attackerStunTime) / 2500) * 100)) //Probability in percentage that it will be an interception instead of a double hit.
{
attacker.InterceptingSkillId = SkillId.CombatMastery;
}
else
{
attacker.InterceptingSkillId = SkillId.CombatMastery;
if (target.CanAttack(attacker))
{
target.InterceptingSkillId = SkillId.CombatMastery;
target.IgnoreAttackRange = true;
var skillHandler = ChannelServer.Instance.SkillManager.GetHandler<ICombatSkill>(combatMastery.Info.Id);
if (skillHandler == null)
{
Log.Error("CombatMastery.Use: Target's skill handler not found for '{0}'.", combatMastery.Info.Id);
}
else
{
//.........这里部分代码省略.........
示例4: Use
/// <summary>
/// Handles skill usage.
/// </summary>
/// <param name="attacker"></param>
/// <param name="skill"></param>
/// <param name="targetEntityId"></param>
/// <returns></returns>
public override CombatSkillResult Use(Creature attacker, Skill skill, long targetEntityId)
{
// Check target
var target = attacker.Region.GetCreature(targetEntityId);
if (target == null)
return CombatSkillResult.InvalidTarget;
if (target.IsNotReadyToBeHit)
return CombatSkillResult.Okay;
if ((attacker.IsStunned || attacker.IsOnAttackDelay) && attacker.InterceptingSkillId == SkillId.None)
return CombatSkillResult.Okay;
// Check range
var attackerPosition = attacker.GetPosition();
var targetPosition = target.GetPosition();
if (!attacker.IgnoreAttackRange &&
(!attackerPosition.InRange(targetPosition, attacker.AttackRangeFor(target))))
{ return CombatSkillResult.OutOfRange; }
if (!attacker.IgnoreAttackRange &&
(attacker.Region.Collisions.Any(attackerPosition, targetPosition) // Check collisions between position
|| target.Conditions.Has(ConditionsA.Invisible))) // Check visiblility (GM)
{ return CombatSkillResult.Okay; }
attacker.IgnoreAttackRange = false;
// Against Normal Attack
Skill combatMastery = target.Skills.Get(SkillId.CombatMastery);
if (combatMastery != null && (target.Skills.ActiveSkill == null || target.Skills.ActiveSkill == combatMastery || target.Skills.IsReady(SkillId.FinalHit)) && target.IsInBattleStance && target.Target == attacker && target.AttemptingAttack && (!target.IsStunned || target.IsKnockedDown))
{
target.InterceptingSkillId = SkillId.Smash;
target.IgnoreAttackRange = true;
var skillHandler = ChannelServer.Instance.SkillManager.GetHandler<ICombatSkill>(combatMastery.Info.Id);
if (skillHandler == null)
{
Log.Error("Smash.Use: Target's skill handler not found for '{0}'.", combatMastery.Info.Id);
return CombatSkillResult.Okay;
}
skillHandler.Use(target, combatMastery, attacker.EntityId);
return CombatSkillResult.Okay;
}
// Against Windmill
//TODO: Change this into the new NPC client system when it comes out if needed.
Skill windmill = target.Skills.Get(SkillId.Windmill);
if (windmill != null && target.Skills.IsReady(SkillId.Windmill) && !target.IsPlayer && target.CanAttack(attacker))
{
target.InterceptingSkillId = SkillId.Smash;
var skillHandler = ChannelServer.Instance.SkillManager.GetHandler<IUseable>(windmill.Info.Id) as Windmill;
if (skillHandler == null)
{
Log.Error("Smash.Use: Target's skill handler not found for '{0}'.", windmill.Info.Id);
return CombatSkillResult.Okay;
}
skillHandler.Use(target, windmill);
return CombatSkillResult.Okay;
}
// Against Smash
Skill smash = target.Skills.Get(SkillId.Smash);
if (smash != null && target.Skills.IsReady(SkillId.Smash) && target.IsInBattleStance && target.Target == attacker && !target.IsStunned && attacker.CanAttack(target))
{
var attackerStunTime = CombatMastery.GetAttackerStun(attacker, attacker.RightHand, false);
var targetStunTime = CombatMastery.GetAttackerStun(target, target.Inventory.RightHand, false);
if ((target.LastKnockedBackBy == attacker && target.KnockDownTime > attacker.KnockDownTime &&
target.KnockDownTime.AddMilliseconds(targetStunTime) < DateTime.Now //If last knocked down within the time it takes for you to finish attacking.
|| attackerStunTime > targetStunTime &&
!Math2.Probability(((2725 - attackerStunTime) / 2500) * 100) //Probability in percentage that you will not lose. 2725 is 2500 (Slowest stun) + 225 (Fastest stun divided by two so that the fastest stun isn't 100%)
&& !(attacker.LastKnockedBackBy == target && attacker.KnockDownTime > target.KnockDownTime && attacker.KnockDownTime.AddMilliseconds(attackerStunTime) < DateTime.Now)))
{
if (target.CanAttack(attacker))
{
target.InterceptingSkillId = SkillId.Smash;
target.IgnoreAttackRange = true;
var skillHandler = ChannelServer.Instance.SkillManager.GetHandler<ICombatSkill>(smash.Info.Id);
if (skillHandler == null)
{
Log.Error("Smash.Use: Target's skill handler not found for '{0}'.", smash.Info.Id);
return CombatSkillResult.Okay;
}
skillHandler.Use(target, smash, attacker.EntityId);
return CombatSkillResult.Okay;
}
}
else
{
attacker.InterceptingSkillId = SkillId.Smash;
}
}
// Stop movement
attacker.StopMove();
target.StopMove();
//.........这里部分代码省略.........
示例5: Use
public void Use(Creature creature, Skill skill, long targetEntityId, int unk1, int unk2)
{
if (_cm == null)
_cm = ChannelServer.Instance.SkillManager.GetHandler<CombatMastery>(SkillId.CombatMastery);
var attackResult = false;
var target = creature.Region.GetCreature(targetEntityId);
if (target != null && !creature.IsStunned && !creature.IsOnAttackDelay && creature.CanTarget(target) && creature.CanAttack(target))
{
var pos = creature.GetPosition();
var targetPos = target.GetPosition();
var inRange = (pos.InRange(targetPos, creature.AttackRangeFor(target))
&& !creature.Region.Collisions.Any(pos, targetPos) // Check collisions between position
&& !target.Conditions.Has(ConditionsA.Invisible)); // Check visiblility (GM)
if (!inRange && !target.IsNotReadyToBeHit)
{
var telePos = pos.GetRelative(targetPos, -creature.AttackRangeFor(target) + 100);
// Check teleport distance
if (pos.GetDistance(telePos) > skill.RankData.Var3 + 100)
{
Send.Notice(creature, "Out of range");
}
else
{
Send.Effect(creature, Effect.SilentMoveTeleport, targetEntityId, (byte)0);
creature.SetPosition(telePos.X, telePos.Y);
Send.SkillTeleport(creature, telePos.X, telePos.Y);
inRange = true;
}
}
if (inRange)
attackResult = (_cm.Use(creature, skill, targetEntityId) == CombatSkillResult.Okay);
}
Send.CombatAttackR(creature, attackResult);
Send.SkillUse(creature, skill.Info.Id, targetEntityId, unk1, unk2);
}