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); }
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); } } }
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); }
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); }
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); }