public static Composite TryDoAreaTransition() { return(new PrioritySelector( new Decorator(delegate { var ret = HasValidAreaTransitionByType(AreaTransitionType.Local); if (ret.Item1 == true) { areaTransitionBeforeTransition = ret.Item2; return true; } return false; }, DoLocalAreaTransition()), new Decorator(delegate { var ret = HasValidAreaTransitionByType(AreaTransitionType.NormalToCorrupted); if (ret.Item1 == true) { areaTransitionBeforeTransition = ret.Item2; return true; } return false; }, DoCorruptedZoneTransition()) )); }
public static Composite DoLocalAreaTransition() { //sepearte between local, to corrupted etc. Handle accordingly. return(new Sequence( new Inverter(CommonBehavior.MoveTo(x => areaTransitionBeforeTransition.areaTransitionGridPosition, spec: CommonBehavior.OpenablesMovementSpec)), new Action(delegate { // Test if were actually close to the area transition if (GameController.Player.GridPos.Distance(areaTransitionBeforeTransition.areaTransitionGridPosition) > 35) { WillBot.LogMessageCombo($"In trying to complete area transition. Movement to area transition must have been canceled"); return RunStatus.Failure; } areaHashBeforeTransition = GameController.Area.CurrentArea.Hash; islandIdBeforeTransition = areaTransitionBeforeTransition.locatedInIslandWithId; var closestAreaTransitionLabel = Me.ClosestAreaTransitionLabel; if (closestAreaTransitionLabel == null) { WillBot.LogMessageCombo($"No area transition nearby"); return RunStatus.Failure; } labelTextOfAreaTransition = closestAreaTransitionLabel.Label.Text; ControlTimer.Restart(); Vector2 prevGridPos = GameController.Player.GridPos; while (ControlTimer.ElapsedMilliseconds < 4000) { Mouse.SetCursorPosAndLeftOrRightClick(closestAreaTransitionLabel.Label.GetClientRect(), Latency); // Try to detect a jump in player gridpos var currentGridPos = GameController.Player.GridPos; if (currentGridPos.Distance(prevGridPos) > 20) { WillBot.LogMessageCombo($"detected large enough jump in grid pos. success"); Thread.Sleep(400); // if local get zone map // else initialize zone.. and add areatransition. var zoneMapAfterTransition = WillBot.Mover.GetZoneMap(); var subMapAfterTransition = zoneMapAfterTransition.GetSubMap(GameController.Player.GridPos); int islandIdAfterTransition = subMapAfterTransition.IslandId; areaTransitionBeforeTransition.leadsToIslandWithId = islandIdAfterTransition; areaTransitionBeforeTransition.hasBeenEntered = true; if (Me.ClosestAreaTransitionLabel != null) { // verify that this is another area transition var newKeyTuple = Me.ClosestAreaTransitionLabel.ItemOnGround.GridPos.ToIntTuple(); if (zoneMapAfterTransition.FoundAreaTransitions.ContainsKey(newKeyTuple)) { //Already registered this area transition WillBot.LogMessageCombo($"already have this area transition"); } else { var transition = new AreaTransitionInfo(Me.ClosestAreaTransitionLabel.Label.Text, Me.ClosestAreaTransitionLabel.ItemOnGround.GridPos, islandIdAfterTransition); transition.leadsToIslandWithId = islandIdBeforeTransition; zoneMapAfterTransition.FoundAreaTransitions.Add(newKeyTuple, transition); } } return RunStatus.Success; } prevGridPos = currentGridPos; Thread.Sleep(100); } // time out can mean area transition that disappears + no movement during the transition // if it timed out but the area transition is gone return RunStatus.Failure; }) //new Action(delegate //{ // if (areaHashBeforeTransition != GameController.Area.CurrentArea.Hash) // { // areaTransitionBeforeTransition.isZoneTransition = true; // return RunStatus.Success; // } // else // { // var zoneMapAfterTransition = WillBot.Mover.GetZoneMap(); // var subMapAfterTransition = zoneMapAfterTransition.GetSubMap(GameController.Player.GridPos); // int islandIdAfterTransition = subMapAfterTransition.IslandId; // areaTransitionBeforeTransition.leadsToIslandWithId = islandIdAfterTransition; // areaTransitionBeforeTransition.hasBeenEntered = true; // // Wait and try to add the area transition // ControlTimer.Restart(); // while (ControlTimer.ElapsedMilliseconds < 6000) // { // areaTransitionAfterTransition = zoneMapAfterTransition.TryGetAreaTransition(Me.ClosestAreaTransitionLabel); // if (areaTransitionAfterTransition != null) // { // break; // } // Thread.Sleep(200); // } // if (areaTransitionAfterTransition == null) return RunStatus.Failure; // areaTransitionAfterTransition.hasBeenEntered = true; // areaTransitionAfterTransition.leadsToIslandWithId = islandIdBeforeTransition; // return RunStatus.Success; // } //}) )); }
public static Composite DoCorruptedZoneTransition() { return(new Sequence( new Inverter(CommonBehavior.MoveTo(x => areaTransitionBeforeTransition.areaTransitionGridPosition, spec: CommonBehavior.OpenablesMovementSpec)), new Action(delegate { // Test if were actually close to the area transition if (GameController.Player.GridPos.Distance(areaTransitionBeforeTransition.areaTransitionGridPosition) > 35) { WillBot.LogMessageCombo($"In trying to complete area transition. Movement to area transition must have been canceled"); return RunStatus.Failure; } areaHashBeforeTransition = GameController.Area.CurrentArea.Hash; islandIdBeforeTransition = areaTransitionBeforeTransition.locatedInIslandWithId; var closestAreaTransitionLabel = Me.ClosestAreaTransitionLabel; if (closestAreaTransitionLabel == null) { WillBot.LogMessageCombo($"No area transition nearby"); return RunStatus.Failure; } labelTextOfAreaTransition = closestAreaTransitionLabel.Label.Text; ControlTimer.Restart(); Vector2 prevGridPos = GameController.Player.GridPos; while (ControlTimer.ElapsedMilliseconds < 4000) { Mouse.SetCursorPosAndLeftOrRightClick(closestAreaTransitionLabel.Label.GetClientRect(), Latency); // Try to detect a jump in player gridpos var currentGridPos = GameController.Player.GridPos; if (currentGridPos.Distance(prevGridPos) > 20) { WillBot.LogMessageCombo($"detected large enough jump in grid pos. success"); Thread.Sleep(400); lock (MyLocks.UpdateTerrainDataLock) { //Issue is that AreaChange function run on another thread and will updateterraindata too.. // Just wait until this can be aquired since that should mean its done updating terrain data } var zoneMapAfterTransition = WillBot.Mover.GetZoneMap(); var subMapAfterTransition = zoneMapAfterTransition.GetSubMap(GameController.Player.GridPos); int islandIdAfterTransition = subMapAfterTransition.IslandId; areaTransitionBeforeTransition.leadsToIslandWithId = islandIdAfterTransition; areaTransitionBeforeTransition.hasBeenEntered = true; if (Me.ClosestAreaTransitionLabel != null) { // verify that this is another area transition var newKeyTuple = Me.ClosestAreaTransitionLabel.ItemOnGround.GridPos.ToIntTuple(); if (zoneMapAfterTransition.FoundAreaTransitions.ContainsKey(newKeyTuple)) { //Already registered this area transition WillBot.LogMessageCombo($"already have this area transition"); } else { var transition = new AreaTransitionInfo(Me.ClosestAreaTransitionLabel.Label.Text, Me.ClosestAreaTransitionLabel.ItemOnGround.GridPos, islandIdAfterTransition); transition.leadsToIslandWithId = islandIdBeforeTransition; transition.leadsToZoneWithAreaHash = areaHashBeforeTransition; transition.transitionType = Me.ClosestAreaTransitionLabel.ItemOnGround.GetComponent <AreaTransition>().TransitionType; zoneMapAfterTransition.FoundAreaTransitions.Add(newKeyTuple, transition); } } return RunStatus.Success; } prevGridPos = currentGridPos; Thread.Sleep(100); } // time out can mean area transition that disappears + no movement during the transition // if it timed out but the area transition is gone return RunStatus.Failure; }))); }