public bool StartAbilityAtPos(AbilityInfo abInfo, byte castSequence, Point3D worldPos, ushort zoneID) { _pendingInfo = abInfo; _pendingInfo.TargetPosition = worldPos; _pendingItemCooldownGroup = 0; _pendingCastSequence = castSequence; byte result = ModifyInitials(); if (result == 1 || !AllowStartCastAtPos() || !_caster.PointWithinRadiusFeet(_pendingInfo.TargetPosition, (int)(_caster.BaseRadius + _pendingInfo.Range))) { CancelPendingCast(); return(false); } if (result == 2) { _abInterface.SetGlobalCooldown(); CancelPendingCast(); return(false); } if (result == 3) { _abInterface.SetCooldown(_pendingInfo.ConstantInfo.CooldownEntry != 0 ? _pendingInfo.ConstantInfo.CooldownEntry : _pendingInfo.Entry, _pendingInfo.Cooldown * 1000); CancelPendingCast(); return(false); } // Cast success. Cancel existing ability if any if (AbInfo != null) { CancelCast(0); } AbInfo = _pendingInfo; _pendingInfo = null; _itemCooldownGroup = 0; _castSequence = castSequence; _castStartTime = TCPManager.GetTimeStampMS(); if (AbInfo.Level == 0) { AbInfo.Level = _abInterface.GetMasteryLevelFor(AbInfo.ConstantInfo.MasteryTree); } if (AbInfo.ConstantInfo.Origin != AbilityOrigin.AO_ITEM) { _caster.BuffInterface.NotifyAbilityStarted(AbInfo); } SendStart(); if (!AbInfo.ConstantInfo.IgnoreGlobalCooldown) { _abInterface.SetGlobalCooldown(); } if (AbInfo.ConstantInfo.ChannelID != 0) { // Channeled Morale 4s grant immunity and cannot be interrupted if (AbInfo.SpecialCost == -4) { _caster.AddCrowdControlImmunity((int)CrowdControlTypes.Unstoppable); _caster.IsImmovable = true; } GroundTarget gt = new GroundTarget(_caster, AbInfo.TargetPosition, GameObjectService.GetGameObjectProto(23)); _caster.Region.AddObject(gt, _caster.Zone.ZoneId); gt.SetExpiry(TCPManager.GetTimeStampMS() + 20000); AbInfo.Target = gt; _channelHandler.Initialize(AbInfo, castSequence); } else { CastAtPosition(); } return(false); }