/// <summary> /// Monster Locations, Generators<para /> /// This will be called from a separate task from our constructor. Use thread safety when interacting with this landblock. /// </summary> private void CreateWorldObjects() { var objects = DatabaseManager.World.GetCachedInstancesByLandblock(Id.Landblock); var shardObjects = DatabaseManager.Shard.GetStaticObjectsByLandblock(Id.Landblock); var factoryObjects = WorldObjectFactory.CreateNewWorldObjects(objects, shardObjects); // for mansion linking var houses = new List <House>(); actionQueue.EnqueueAction(new ActionEventDelegate(() => { foreach (var fo in factoryObjects) { WorldObject parent = null; if (fo.WeenieType == ACE.Entity.Enum.WeenieType.House && fo.HouseType == ACE.Entity.Enum.HouseType.Mansion) { var house = fo as House; houses.Add(house); house.LinkedHouses.Add(houses[0]); if (houses.Count > 1) { houses[0].LinkedHouses.Add(house); parent = houses[0]; } } AddWorldObject(fo); fo.ActivateLinks(objects, shardObjects, parent); } })); }
/// <summary> /// Monster Locations, Generators<para /> /// This will be called from a separate task from our constructor. Use thread safety when interacting with this landblock. /// </summary> private void CreateWorldObjects() { var objects = DatabaseManager.World.GetCachedInstancesByLandblock(Id.Landblock); var shardObjects = DatabaseManager.Shard.GetStaticObjectsByLandblock(Id.Landblock); var factoryObjects = WorldObjectFactory.CreateNewWorldObjects(objects, shardObjects); actionQueue.EnqueueAction(new ActionEventDelegate(() => { foreach (var fo in factoryObjects) { AddWorldObject(fo); fo.ActivateLinks(objects, shardObjects); } })); }
public void AllStarCombo(Obj_AI_Base target) { ActionQueue.EnqueueAction( ComboQueue, () => R.IsReady() && Player.Instance.IsVisible, () => { R.Cast(target); LastRCast = Game.Time; }, () => R.IsReady() && !Player.Instance.IsVisible && !ShadowManager.CanCastR(true)); ActionQueue.EnqueueAction( ComboQueue, () => true, () => ItemManager.UseAll(target), () => true); ActionQueue.EnqueueAction( ComboQueue, () => Misc.IsChecked(ComboMenu, "comboW") && ShadowManager.CanCastW, () => ShadowManager.Cast(target.ServerPosition), () => target.IsDead || target.IsZombie || !Misc.IsChecked(ComboMenu, "comboW")); ActionQueue.EnqueueAction( ComboQueue, () => Misc.IsChecked(ComboMenu, "comboQ") && Q.IsReady(), () => Q.Cast(Q.GetPrediction(target).CastPosition), () => target.IsDead || target.IsZombie || !Q.IsReady() || !Misc.IsChecked(ComboMenu, "comboQ")); ActionQueue.EnqueueAction( ComboQueue, () => Misc.IsChecked(ComboMenu, "comboE") && E.IsReady() && Player.Instance.GetAutoAttackRange() >= Player.Instance.Distance(target), () => E.Cast(), () => target.IsDead || target.IsZombie || !E.IsReady() || !Misc.IsChecked(ComboMenu, "comboE") || !E.IsInRange(target)); }
/// <summary> /// Monster Locations, Generators<para /> /// This will be called from a separate task from our constructor. Use thread safety when interacting with this landblock. /// </summary> private void CreateWorldObjects() { var objects = DatabaseManager.World.GetCachedInstancesByLandblock(Id.Landblock); var shardObjects = DatabaseManager.Shard.GetStaticObjectsByLandblock(Id.Landblock); var factoryObjects = WorldObjectFactory.CreateNewWorldObjects(objects, shardObjects); actionQueue.EnqueueAction(new ActionEventDelegate(() => { // for mansion linking var houses = new List <House>(); foreach (var fo in factoryObjects) { WorldObject parent = null; if (fo.WeenieType == WeenieType.House) { var house = fo as House; Houses.Add(house); if (fo.HouseType == HouseType.Mansion) { houses.Add(house); house.LinkedHouses.Add(houses[0]); if (houses.Count > 1) { houses[0].LinkedHouses.Add(house); parent = houses[0]; } } } AddWorldObject(fo); fo.ActivateLinks(objects, shardObjects, parent); if (fo.PhysicsObj != null) { fo.PhysicsObj.Order = 0; } } CreateWorldObjectsCompleted = true; _landblock.SortObjects(); })); }
private void AntiGapcloser_OnEnemyGapcloser(ActiveGapcloser gapcloser) { if (ObjectManager.Player.Distance(gapcloser.Sender.Position) > e.Range) { return; } if (zedMenu.GetParamBool("koreanzed.miscmenu.useeantigc") && e.IsReady()) { e.Cast(); //Console.WriteLine("antig1"); } if (zedMenu.GetParamBool("koreanzed.miscmenu.usewantigc") && w.IsReady() && antiGapCloserList.Count == 0) { if (shadows.CanCast) { actionQueue.EnqueueAction( antiGapCloserList, () => player.Mana > w.ManaCost && player.HealthPercent - 10 < gapcloser.Sender.HealthPercent, () => shadows.Cast(Vector3.Negate(gapcloser.Sender.Position)), () => true); actionQueue.EnqueueAction( antiGapCloserList, () => w.Instance.ToggleState != 0, () => shadows.Switch(), () => !w.IsReady()); Game.OnUpdate += Game_OnUpdate; return; } else if (!shadows.CanCast && shadows.CanSwitch) { int champCount = HeroManager.Enemies.Count(enemy => enemy.Distance(shadows.Instance.Position) < 1500F); if ((player.HealthPercent > 80 && champCount <= 3) || (player.HealthPercent > 40 && champCount <= 2) ) { shadows.Switch(); //Console.WriteLine("antig2"); } } } }
public static void PlayerEnterWorld(Session session, Character character) { var offlinePlayer = PlayerManager.GetOfflinePlayer(character.Id); if (offlinePlayer == null) { log.Error($"PlayerEnterWorld requested for character.Id 0x{character.Id:X8} not found in PlayerManager OfflinePlayers."); return; } var start = DateTime.UtcNow; DatabaseManager.Shard.GetPossessedBiotasInParallel(character.Id, biotas => { log.Debug($"GetPossessedBiotasInParallel for {character.Name} took {(DateTime.UtcNow - start).TotalMilliseconds:N0} ms"); ActionQueue.EnqueueAction(new ActionEventDelegate(() => DoPlayerEnterWorld(session, character, offlinePlayer.Biota, biotas))); }); }
public static void PlayerEnterWorld(Session session, Character character) { var start = DateTime.UtcNow; DatabaseManager.Shard.GetPlayerBiotas(character.Id, biotas => { log.Debug($"GetPlayerBiotas for {character.Name} took {(DateTime.UtcNow - start).TotalMilliseconds:N0} ms"); playerEnterWorldQueue.EnqueueAction(new ActionEventDelegate(() => DoPlayerEnterWorld(session, character, biotas))); }); }
/// <summary> /// Prepare new action to run on this object /// </summary> public LinkedListNode <IAction> EnqueueAction(IAction action) { return(actionQueue.EnqueueAction(action)); }
/// <summary> /// Prepare new action to run on this player /// </summary> public override void EnqueueAction(IAction action) { actionQueue.EnqueueAction(action); }
private void Combo() { if (actionQueue.ExecuteNextAction(comboQueue)) { return; } if (q.UseOnCombo && q.IsReady()) { if (CastQ(true)) { return; } } if (w.UseOnCombo && w.IsReady() && TargetSelector.GetTarget(player.AttackRange + 30F, TargetSelector.DamageType.Physical) != null) { AIHeroClient target = TargetSelector.GetTarget(player.AttackRange + 30F, TargetSelector.DamageType.Physical); if (target != null) { actionQueue.EnqueueAction(comboQueue, () => true, () => w.Cast(), () => !w.IsReady()); actionQueue.EnqueueAction(comboQueue, () => true, () => olafItems.UseItems(target), () => true); actionQueue.EnqueueAction( comboQueue, () => true, () => EloBuddy.Player.IssueOrder(GameObjectOrder.AttackUnit, target), () => autoAttackCheck.Status || player.Distance(target) > Orbwalking.GetRealAutoAttackRange(target)); return; } } if (e.UseOnCombo && e.IsReady()) { AIHeroClient target = TargetSelector.GetTarget(e.Range, e.DamageType); if (target != null) { actionQueue.EnqueueAction( comboQueue, () => true, () => EloBuddy.Player.IssueOrder(GameObjectOrder.AttackUnit, target), () => autoAttackCheck.Status); actionQueue.EnqueueAction(comboQueue, () => true, () => olafItems.UseItems(target), () => true); actionQueue.EnqueueAction(comboQueue, () => true, () => CastE(target), () => !e.IsReady()); actionQueue.EnqueueAction( comboQueue, () => true, () => EloBuddy.Player.IssueOrder(GameObjectOrder.AttackUnit, target), () => autoAttackCheck.Status || player.Distance(target) > Orbwalking.GetRealAutoAttackRange(target)); } } }
private void Combo() { if (actionQueue.ExecuteNextAction(comboQueue)) { return; } if (w.UseOnCombo && w.IsReady() && player.HasBuff("zedr2") && shadows.CanCast) { Obj_AI_Hero target = TargetSelector.GetTarget(w.Range + e.Range, TargetSelector.DamageType.Physical); if (target != null) { actionQueue.EnqueueAction(comboQueue, () => true, () => shadows.Cast(target), () => true); return; } } float maxRange = float.MaxValue; if (r.UseOnCombo && r.IsReady() && r.Instance.ToggleState == 0) { Obj_AI_Hero target = null; maxRange = Math.Min(maxRange, r.Range); if (zedMenu.GetParamBool("koreanzed.combo.ronselected")) { if (TargetSelector.SelectedTarget != null && TargetSelector.SelectedTarget.IsValidTarget(maxRange)) { target = TargetSelector.SelectedTarget; } } else { List <Obj_AI_Hero> ignoredChamps = zedMenu.GetBlockList(BlockListType.Ultimate); target = TargetSelector.GetTarget(maxRange, r.DamageType, true, ignoredChamps); } if (target != null) { actionQueue.EnqueueAction( comboQueue, () => r.IsReady() && r.Instance.ToggleState == 0, () => r.Cast(target), () => r.Instance.ToggleState != 0); actionQueue.EnqueueAction(comboQueue, () => true, () => zedItems.UseItems(target), () => true); return; } } if (q.UseOnCombo) { maxRange = Math.Min(maxRange, q.Range); Obj_AI_Hero target = TargetSelector.GetTarget(maxRange, q.DamageType); PredictionOutput predictionOutput = q.GetPrediction(target); if (predictionOutput.Hitchance >= HitChance.VeryHigh) { q.Cast(predictionOutput.CastPosition); } } if (e.UseOnCombo) { maxRange = Math.Min(maxRange, e.Range); Obj_AI_Hero target = TargetSelector.GetTarget(maxRange, e.DamageType); if (target != null) { actionQueue.EnqueueAction(comboQueue, () => true, () => zedItems.UseItems(target), () => true); actionQueue.EnqueueAction(comboQueue, () => e.IsReady(), () => e.Cast(), () => true); } } if (w.UseOnCombo && w.IsReady() && w.Instance.ToggleState != 0) { List <Obj_AI_Base> shadowList = shadows.GetShadows(); foreach (Obj_AI_Base objAiBase in shadowList) { Obj_AI_Hero target = TargetSelector.GetTarget(2000F, TargetSelector.DamageType.Physical); if (target != null && player.Distance(target) > Orbwalking.GetRealAutoAttackRange(target) + 50F && objAiBase.Distance(target) < player.Distance(target)) { w.Cast(); } } } }
public void LaneClear(ActionQueue actionQueue, ActionQueueList laneClearQueue) { Obj_AI_Base shadow = GetShadows().FirstOrDefault(); if (!energy.ReadyToLaneClear || shadow == null) { return; } if (e.UseOnLaneClear && e.IsReady()) { int extendedWillHit = MinionManager.GetMinions(shadow.Position, e.Range).Count(); int shortenWillHit = MinionManager.GetMinions(e.Range).Count; int param = zedMenu.GetParamSlider("koreanzed.laneclearmenu.useeif"); if (extendedWillHit >= param || shortenWillHit >= param) { actionQueue.EnqueueAction( laneClearQueue, () => true, () => e.Cast(), () => !e.IsReady()); //Console.WriteLine("shadow lc e 1"); return; } } if (q.UseOnLaneClear && q.IsReady()) { int extendedWillHit = 0; Vector3 extendedFarmLocation = Vector3.Zero; foreach (Obj_AI_Base objAiBase in MinionManager.GetMinions(shadow.Position, q.Range)) { var colisionList = q.GetCollision( shadow.Position.To2D(), new List <Vector2>() { objAiBase.Position.To2D() }, w.Delay); if (colisionList.Count > extendedWillHit) { extendedFarmLocation = colisionList.OrderByDescending(c => c.Distance(shadow.Position)).FirstOrDefault().Position; extendedWillHit = colisionList.Count; } } var shortenFarmLocation = q.GetLineFarmLocation(MinionManager.GetMinions(q.Range)); int shortenWillHit = shortenFarmLocation.MinionsHit; int param = zedMenu.GetParamSlider("koreanzed.laneclearmenu.useqif"); if (CanCast && shadow.Position != Vector3.Zero && extendedWillHit >= param) { actionQueue.EnqueueAction( laneClearQueue, () => CanCast, () => Cast(shadow.Position), () => !CanCast); //Console.WriteLine("shadow lc w 2"); actionQueue.EnqueueAction( laneClearQueue, () => w.Instance.ToggleState != 0, () => q.Cast(extendedFarmLocation), () => !q.IsReady()); //Console.WriteLine("shadow lc q 3"); return; } else if (shortenWillHit >= param) { actionQueue.EnqueueAction( laneClearQueue, () => q.IsReady(), () => q.Cast(shortenFarmLocation.Position), () => !q.IsReady()); //Console.WriteLine("shadow lc q 4"); return; } } }
/// <summary> /// Prepare new action to run on this object /// </summary> public void EnqueueAction(IAction action) { actionQueue.EnqueueAction(action); }
private void Combo() { if (actionQueue.ExecuteNextAction(comboQueue)) { return; } AIHeroClient itemsTarget = TargetSelector.GetTarget(player.AttackRange, TargetSelector.DamageType.Physical); if (itemsTarget != null) { zedItems.UseItems(itemsTarget); } shadows.Combo(); if (w.UseOnCombo && shadows.CanCast && player.HasBuff("ZedR2")) { AIHeroClient target = TargetSelector.GetTarget(w.Range + e.Range, TargetSelector.DamageType.Physical); if (target != null) { actionQueue.EnqueueAction(comboQueue, () => true, () => shadows.Cast(w.GetPrediction(target).CastPosition), () => true); return; } } float maxRange = float.MaxValue; if (r.UseOnCombo && r.IsReady() && r.Instance.ToggleState == 0) { AIHeroClient target = null; maxRange = Math.Min(maxRange, r.Range); if (zedMenu.GetParamBool("koreanzed.combo.ronselected")) { if (TargetSelector.SelectedTarget != null && TargetSelector.SelectedTarget.IsValidTarget(maxRange)) { target = TargetSelector.SelectedTarget; } } else { List <AIHeroClient> ignoredChamps = zedMenu.GetBlockList(BlockListType.Ultimate); target = TargetSelector.GetTarget(maxRange, r.DamageType, true, ignoredChamps); } if (target != null) { switch (zedMenu.GetCombo()) { case ComboType.AllStar: AllStarCombo(target); break; case ComboType.TheLine: TheLineCombo(target); break; } return; } } else if (w.UseOnCombo && shadows.CanCast && (!r.UseOnCombo || (r.UseOnCombo && !r.IsReady())) && (player.Mana > w.ManaCost + (q.UseOnCombo && q.IsReady() ? q.ManaCost : 0F) + (e.UseOnCombo && e.IsReady() ? e.ManaCost : 0F))) { maxRange = Math.Min(maxRange, w.Range + e.Range); AIHeroClient target = TargetSelector.GetTarget(maxRange, TargetSelector.DamageType.Physical); if (target != null) { actionQueue.EnqueueAction( comboQueue, () => shadows.CanCast, () => shadows.Cast(w.GetPrediction(target).CastPosition), () => !shadows.CanCast); actionQueue.EnqueueAction( comboQueue, () => w.Instance.ToggleState != 0, () => shadows.Combo(), () => true); actionQueue.EnqueueAction( comboQueue, () => shadows.CanSwitch && target.Distance(shadows.Instance.Position) <= player.AttackRange, () => shadows.Switch(), () => !shadows.CanSwitch || target.Distance(shadows.Instance.Position) > player.AttackRange || !w.IsReady()); actionQueue.EnqueueAction( comboQueue, () => player.Distance(target) <= Orbwalking.GetRealAutoAttackRange(target), () => EloBuddy.Player.IssueOrder(GameObjectOrder.AttackUnit, target), () => target.IsDead || target.IsZombie || player.Distance(target) > Orbwalking.GetRealAutoAttackRange(target) || checkAutoAttack.Status); return; } } if (q.UseOnCombo && q.IsReady() && player.Mana > q.ManaCost) { maxRange = Math.Min(maxRange, q.Range); AIHeroClient target = TargetSelector.GetTarget(maxRange, q.DamageType); PredictionOutput predictionOutput = q.GetPrediction(target); if (predictionOutput.Hitchance >= HitChance.Medium) { q.Cast(predictionOutput.CastPosition); } } if (e.UseOnCombo && e.IsReady() && player.Mana > e.ManaCost) { maxRange = Math.Min(maxRange, e.Range); AIHeroClient target = TargetSelector.GetTarget(maxRange, e.DamageType); if (target != null) { actionQueue.EnqueueAction(comboQueue, () => e.IsReady(), () => e.Cast(), () => true); return; } } if (w.UseOnCombo && w.IsReady() && shadows.CanSwitch) { List <Obj_AI_Base> shadowList = shadows.GetShadows(); foreach (Obj_AI_Base objAiBase in shadowList) { AIHeroClient target = TargetSelector.GetTarget(2000F, TargetSelector.DamageType.Physical); if (target != null && player.Distance(target) > Orbwalking.GetRealAutoAttackRange(target) + 50F && objAiBase.Distance(target) < player.Distance(target)) { shadows.Switch(); } } } }