Пример #1
0
        protected override void OnActivate()
        {
            this.context.Inventory.Attach(this);

            this.config = new SnatcherConfig(this.context.Renderer);
            this.context.MenuManager.RegisterMenu(this.config);

            foreach (var blinkAbilityId in BlinkAbilityIds)
            {
                var ability = this.owner.GetAbilityById(blinkAbilityId);
                if (ability != null)
                {
                    try
                    {
                        this.blinkAbility = this.abilityFactory.Value.GetAbility <RangedAbility>(ability);
                        Log.Debug($"Snatcher: found ability for greed mode {this.blinkAbility}");
                    }
                    catch (AbilityNotImplementedException)
                    {
                        // not added to sdk yet
                    }
                }
            }

            this.onUpdateHandler = UpdateManager.Run(this.OnUpdate);
        }
Пример #2
0
        private async Task ApproachEntity(RangedAbility blink, Entity entity, float checkRange, CancellationToken token = default(CancellationToken))
        {
            if (blink != null)
            {
                var distance = this.owner.Distance2D(entity);
                if (distance >= PickUpDistance)
                {
                    var dir = (entity.Position - this.owner.Position).Normalized();
                    dir *= distance >= checkRange ? checkRange : distance;
                    var blinkPos = this.owner.Position + dir;

                    blink.UseAbility(blinkPos);
                    await Task.Delay(blink.GetCastDelay(blinkPos), token);
                }
            }
        }
Пример #3
0
    public void Init(RangedAbility a, string t, Vector3 direction, float lt)
    {
        base.Init(a, t, lt);
        rb                = GetComponent <Rigidbody>();
        sr                = GetComponent <SpriteRenderer>();
        rb.constraints    = RigidbodyConstraints.FreezePositionY;
        rb.freezeRotation = true;
        rb.useGravity     = false;
        string tagNLayer = Ability.UsedBy.tag == "Player" ? "PlayerProjectile" : "EnemyProjectile";;

        transform.tag    = tagNLayer;
        gameObject.layer = LayerMask.NameToLayer(tagNLayer);
        Vector3 temp = ((Player)Ability.UsedBy).ProjectileSpawn.position;

        transform.position  = new Vector3(temp.x, 0.01f, temp.z);
        sr.sprite           = Ability.projectileSprite;
        sr.sortingLayerName = "Projectile";
        GetComponent <SphereCollider>().radius = .125f;
        HitSlave = new GameObject().AddComponent <CoroutineSlave>();
        HitSlave.gameObject.transform.parent = transform;


        Fire(direction);
    }
Пример #4
0
        private async Task OnUpdate(CancellationToken token)
        {
            if (!this.config.HoldHotkey.Value.Active && !this.config.ToggleHotkey.Value.Active)
            {
                await Task.Delay(this.config.ScanIntervall, token);

                return;
            }

            if (Game.IsPaused || !this.owner.IsAlive)
            {
                await Task.Delay(this.config.ScanIntervall, token);

                return;
            }

            float checkRange = 300;

            // if (this.config.GreedMode.Value.Dictionary.Any(x => x.Value))
            RangedAbility blink = null;

            if (this.config.GreedMode)
            {
                var blinkItem = this.abilityFactory.Value.GetItem <item_blink>();
                if ((blinkItem != null) && blinkItem.CanBeCasted)
                {
                    blink      = blinkItem;
                    checkRange = blinkItem.CastRange;
                }
                else if ((this.blinkAbility != null) && this.blinkAbility.CanBeCasted)
                {
                    blink      = this.blinkAbility;
                    checkRange = this.blinkAbility.CastRange;
                }
            }

            var hasFreeSlots      = this.owner.Inventory.FreeInventorySlots.Any();
            var freeBackbackSlots = this.owner.Inventory.FreeBackpackSlots.ToList();

            bool swapItem = this.config.SwapItem;

            if (hasFreeSlots || (swapItem && freeBackbackSlots.Any()))
            {
                var grabAegis  = this.config.SnatchOptions.Value.IsEnabled("item_aegis");
                var grabRapier = this.config.SnatchOptions.Value.IsEnabled("item_rapier");
                var grabCheese = this.config.SnatchOptions.Value.IsEnabled("item_cheese");
                var grabGem    = this.config.SnatchOptions.Value.IsEnabled("item_gem");

                if (grabAegis || grabRapier || grabCheese || grabGem)
                {
                    var query = EntityManager <PhysicalItem> .Entities.Where(x => x.IsVisible && (x.Distance2D(this.owner) < (checkRange + PickUpDistance)));

                    query = query.Where(
                        x => (grabAegis && (x.Item.Id == AbilityId.item_aegis)) ||
                        (grabCheese && (x.Item.Id == AbilityId.item_cheese)) ||
                        (grabRapier && (x.Item.Id == AbilityId.item_rapier)) ||
                        (grabGem && (x.Item.Id == AbilityId.item_gem)));

                    var physicalItem = query.FirstOrDefault();
                    if (physicalItem != null)
                    {
                        if (!hasFreeSlots)
                        {
                            // check if hero already has a cheese
                            if ((physicalItem.Item.Id != AbilityId.item_cheese) || (this.owner.GetItemById(AbilityId.item_cheese) != null))
                            {
                                // swap lowest cost item
                                var item = this.owner.Inventory.Items.Where(x => x.IsKillable && (x.Id != AbilityId.item_aegis)).OrderBy(x => x.Cost).FirstOrDefault();
                                if (item == null)
                                {
                                    await Task.Delay(this.config.ScanIntervall, token);

                                    return;
                                }

                                item.MoveItem(freeBackbackSlots.First());
                            }
                        }

                        // if (this.config.GreedMode.Value.IsEnabled(physicalItem.Item.Name))
                        if (blink != null)
                        {
                            await this.ApproachEntity(blink, physicalItem, checkRange, token);
                        }

                        this.owner.PickUpItem(physicalItem);
                        await Task.Delay(this.config.ScanIntervall, token);

                        return;
                    }
                }
            }

            if (this.config.SnatchOptions.Value.IsEnabled("rune_bounty"))
            {
                var runes = EntityManager <Rune> .Entities.Where(x => x.IsVisible && (x.Distance2D(this.owner) < (checkRange + PickUpDistance))).ToList();

                if (runes.Any())
                {
                    var rune = runes.First();

                    // if (this.config.GreedMode.Value.IsEnabled("rune_bounty"))
                    if (blink != null)
                    {
                        await this.ApproachEntity(blink, rune, checkRange, token);
                    }

                    this.owner.PickUpRune(rune);
                }
            }

            await Task.Delay(this.config.ScanIntervall, token);
        }
Пример #5
0
        private async Task OnUpdate(CancellationToken token)
        {
            if (!this.config.IsActive && !this.config.IsActiveHold)
            {
                await Task.Delay(this.config.ScanIntervall.Value, token);

                return;
            }

            if (Game.IsPaused || !this.owner.IsAlive)
            {
                await Task.Delay(this.config.ScanIntervall.Value, token);

                return;
            }

            float checkRange = this.config.CheckRange.Value;

            RangedAbility blink = null;

            if (this.config.GreedMode && this.config.GreedOptions.PictureStates.Any(x => x.Value))
            {
                if (this.Blink != null && this.Blink.CanBeCasted)
                {
                    blink = this.Blink;
                }
                else if (this.blinkAbility != null && this.blinkAbility.CanBeCasted)
                {
                    blink = this.blinkAbility;
                }
            }

            var hasFreeSlots      = this.owner.Inventory.FreeInventorySlots.Any();
            var freeBackbackSlots = this.owner.Inventory.FreeBackpackSlots.ToList();

            bool swapItem = this.config.SwapItem;

            if (hasFreeSlots || (swapItem && freeBackbackSlots.Any()))
            {
                var items = EntityManager <PhysicalItem> .Entities.Where(
                    x => x.IsVisible &&
                    (x.Item.Id == AbilityId.item_aegis ||
                     x.Item.Id == AbilityId.item_cheese ||
                     x.Item.Id == AbilityId.item_rapier ||
                     x.Item.Id == AbilityId.item_gem));

                foreach (var physicalItem in items)
                {
                    var name = physicalItem.Item.Name;
                    if (!this.config.SnatchOptions[name])
                    {
                        continue;
                    }

                    var range = blink != null && this.config.GreedOptions[name] ? blink.CastRange : this.config.CheckRange.Value;
                    if (physicalItem.Distance2D(this.owner) > (range + PickUpDistance))
                    {
                        continue;
                    }

                    if (!hasFreeSlots && !physicalItem.Item.IsStackable)
                    {
                        // swap lowest cost item
                        var item = this.owner.Inventory.Items.Where(x => x.IsKillable && x.Id != AbilityId.item_aegis && x.Id != AbilityId.item_blink)
                                   .OrderBy(x => x.Cost)
                                   .FirstOrDefault();
                        if (item == null)
                        {
                            await Task.Delay(this.config.ScanIntervall.Value, token);

                            return;
                        }

                        item.MoveItem(freeBackbackSlots.First());
                    }

                    if (blink != null && this.config.GreedOptions[physicalItem.Item.Name])
                    {
                        await this.ApproachEntity(blink, physicalItem, token);
                    }

                    this.owner.PickUpItem(physicalItem);
                    await Task.Delay(this.config.ScanIntervall.Value, token);

                    return;
                }
            }

            if (this.config.SnatchOptions["rune_doubledamage"])
            {
                var range = blink != null && this.config.GreedOptions["rune_doubledamage"] ? blink.CastRange : this.config.CheckRange.Value;
                var rune  = EntityManager <Rune> .Entities.FirstOrDefault(x => x.IsVisible && x.Distance2D(this.owner) <= (range + PickUpDistance));

                if (rune != null)
                {
                    if (blink != null && this.config.GreedOptions["rune_doubledamage"])
                    {
                        await this.ApproachEntity(blink, rune, token);
                    }

                    this.owner.PickUpRune(rune);
                }
            }

            await Task.Delay(this.config.ScanIntervall.Value, token);
        }