protected override bool TryStartEnter(Actor self, Actor targetActor) { if (enterActor != targetActor) { enterActor = targetActor; enterCaptureManager = targetActor.TraitOrDefault <CaptureManager>(); } // Make sure we can still capture the target before entering // (but not before, because this may stop the actor in the middle of nowhere) if (enterCaptureManager == null || !enterCaptureManager.CanBeTargetedBy(enterActor, self, manager)) { Cancel(self, true); return(false); } // StartCapture returns false when a capture delay is enabled // We wait until it returns true before allowing entering the target Captures captures; if (!manager.StartCapture(self, enterActor, enterCaptureManager, out captures)) { return(false); } if (!captures.Info.ConsumedByCapture) { // Immediately capture without entering or disposing the actor DoCapture(self, captures); Cancel(self, true); return(false); } return(true); }
protected override void TickInner(Actor self, Target target, bool targetIsDeadOrHiddenActor) { if (target.Type == TargetType.Actor && enterActor != target.Actor) { enterActor = target.Actor; enterCaptureManager = target.Actor.TraitOrDefault <CaptureManager>(); } if (!targetIsDeadOrHiddenActor && target.Type != TargetType.FrozenActor && (enterCaptureManager == null || !enterCaptureManager.CanBeTargetedBy(enterActor, self, manager))) { Cancel(self, true); } }
protected override bool CanReserve(Actor self) { return(!actor.IsDead && !targetManager.BeingCaptured && targetManager.CanBeTargetedBy(actor, self, manager)); }