public static List<Vector2D> FindPath(RoomUser User, bool Diag, Gamemap Map, Vector2D Start, Vector2D End) { var Path = new List<Vector2D>(); PathFinderNode Nodes = FindPathReversed(User, Diag, Map, Start, End); if (Nodes != null) { Path.Add(End); while (Nodes.Next != null) { Path.Add(Nodes.Next.Position); Nodes = Nodes.Next; } } return Path; }
public static PathFinderNode FindPathReversed(RoomUser User, bool Diag, Gamemap Map, Vector2D Start, Vector2D End) { var OpenList = new MinHeap<PathFinderNode>(256); var PfMap = new PathFinderNode[Map.Model.MapSizeX, Map.Model.MapSizeY]; PathFinderNode Node; Vector2D Tmp; int Cost; int Diff; var Current = new PathFinderNode(Start); Current.Cost = 0; var Finish = new PathFinderNode(End); PfMap[Current.Position.X, Current.Position.Y] = Current; OpenList.Add(Current); while (OpenList.Count > 0) { Current = OpenList.ExtractFirst(); Current.InClosed = true; for (int i = 0; Diag ? i < DiagMovePoints.Length : i < NoDiagMovePoints.Length; i++) { Tmp = Current.Position + (Diag ? DiagMovePoints[i] : NoDiagMovePoints[i]); bool IsFinalMove = (Tmp.X == End.X && Tmp.Y == End.Y); if (Map.IsValidStep(new Vector2D(Current.Position.X, Current.Position.Y), Tmp, IsFinalMove, User.AllowOverride)) { if (PfMap[Tmp.X, Tmp.Y] == null) { Node = new PathFinderNode(Tmp); PfMap[Tmp.X, Tmp.Y] = Node; } else { Node = PfMap[Tmp.X, Tmp.Y]; } if (!Node.InClosed) { Diff = 0; if (Current.Position.X != Node.Position.X) { Diff += 1; } if (Current.Position.Y != Node.Position.Y) { Diff += 1; } Cost = Current.Cost + Diff + Node.Position.GetDistanceSquared(End); if (Cost < Node.Cost) { Node.Cost = Cost; Node.Next = Current; } if (!Node.InOpen) { if (Node.Equals(Finish)) { Node.Next = Current; return Node; } Node.InOpen = true; OpenList.Add(Node); } } } } } return null; }
/*internal bool IsValidMovement(int CoordX, int CoordY) { if (CoordX < 0 || CoordY < 0 || CoordX >= Model.MapSizeX || CoordY >= Model.MapSizeY) return false; if (SquareHasUsers(CoordX, CoordY)) return false; if (GetCoordinatedItems(new Point(CoordX, CoordY)).Count > 0 && !SquareIsOpen(CoordX, CoordY, false)) return false; return Model.SqState[CoordX, CoordY] == SquareState.OPEN; }*/ public bool IsValidStep2(RoomUser User, Vector2D From, Vector2D To, bool EndOfPath, bool Override) { if (User == null) return false; if (!ValidTile(To.X, To.Y)) return false; if (Override) return true; /* * 0 = blocked * 1 = open * 2 = last step * 3 = door * */ List<Item> Items = _room.GetGameMap().GetAllRoomItemForSquare(To.X, To.Y); if (Items.Count > 0) { bool HasGroupGate = Items.ToList().Where(x => x.GetBaseItem().InteractionType == InteractionType.GUILD_GATE).ToList().Count() > 0; if (HasGroupGate) { Item I = Items.FirstOrDefault(x => x.GetBaseItem().InteractionType == InteractionType.GUILD_GATE); if (I != null) { Group Group = null; if (!PlusEnvironment.GetGame().GetGroupManager().TryGetGroup(I.GroupId, out Group)) return false; if (User.GetClient() == null || User.GetClient().GetHabbo() == null) return false; if (Group.IsMember(User.GetClient().GetHabbo().Id)) { I.InteractingUser = User.GetClient().GetHabbo().Id; I.ExtraData = "1"; I.UpdateState(false, true); I.RequestUpdate(4, true); return true; } else { if (User.Path.Count > 0) User.Path.Clear(); User.PathRecalcNeeded = false; return false; } } } } bool Chair = false; double HighestZ = -1; foreach (Item Item in Items.ToList()) { if (Item == null) continue; if (Item.GetZ < HighestZ) { Chair = false; continue; } HighestZ = Item.GetZ; if (Item.GetBaseItem().IsSeat) Chair = true; } if ((mGameMap[To.X, To.Y] == 3 && !EndOfPath && !Chair) || (mGameMap[To.X, To.Y] == 0) || (mGameMap[To.X, To.Y] == 2 && !EndOfPath)) { if (User.Path.Count > 0) User.Path.Clear(); User.PathRecalcNeeded = true; } double HeightDiff = SqAbsoluteHeight(To.X, To.Y) - SqAbsoluteHeight(From.X, From.Y); if (HeightDiff > 1.5 && !User.RidingHorse) return false; //Check this last, because ya. RoomUser Userx = _room.GetRoomUserManager().GetUserForSquare(To.X, To.Y); if (Userx != null) { if (!Userx.IsWalking && EndOfPath) return false; } return true; }
public bool IsValidStep(Vector2D From, Vector2D To, bool EndOfPath, bool Override, bool Roller = false) { if (!ValidTile(To.X, To.Y)) return false; if (Override) return true; /* * 0 = blocked * 1 = open * 2 = last step * 3 = door * */ if (_room.RoomBlockingEnabled == 0 && SquareHasUsers(To.X, To.Y)) return false; List<Item> Items = _room.GetGameMap().GetAllRoomItemForSquare(To.X, To.Y); if (Items.Count > 0) { bool HasGroupGate = Items.ToList().Where(x => x != null && x.GetBaseItem().InteractionType == InteractionType.GUILD_GATE).Count() > 0; if (HasGroupGate) return true; } if ((mGameMap[To.X, To.Y] == 3 && !EndOfPath) || mGameMap[To.X, To.Y] == 0 || (mGameMap[To.X, To.Y] == 2 && !EndOfPath)) return false; if (!Roller) { double HeightDiff = SqAbsoluteHeight(To.X, To.Y) - SqAbsoluteHeight(From.X, From.Y); if (HeightDiff > 1.5) return false; } return true; }