public static void BlockDirection(Attackable.Context ctx) { if (ctx.actor.TryGetShield(out var shieldItem)) { var shield = shieldItem.GetShieldComponent(); if (ctx.direction == -shield.GetRotatedRelativeOrientation(ctx.actor)) { ctx.resistance.pierce += shield._pierceIncrease; } } }
public static void Teleport(Attackable.Context ctx) { if (ctx.actor.IsDead() && ctx.attacker != null) { var transform = ctx.actor.GetTransform(); var attackerTransform = ctx.attacker.GetTransform(); foreach (var t in transform.GetCell().GetAllFromLayer(TeleportedLayer)) { t.ResetPositionInGrid(attackerTransform.position); } attackerTransform.ResetPositionInGrid(transform.position); } }
private void AbsorbDamageAndBreak(Attackable.Context ctx) { if (ctx.attack.damage > 0 && ctx.actor.TryGetInventory(out var inventory) && inventory.TryGetShield(out var shieldItem)) { var shieldComponent = shieldItem.GetShieldComponent(); if (ctx.direction == -shieldComponent.GetRotatedRelativeOrientation(ctx.actor)) { shieldItem.BeDestroyed(ctx.actor, inventory); // shieldItem.BeUnequippedLogic(ctx.actor); // inventory.RemoveFromSlot(Shield.Slot.Id); ctx.attack.damage = 0; } } }