private bool OutsideRoad(Ets2Item road, float x, float y) { if (road == null) { return(true); } if (road.StartNode == null || road.EndNode == null) { return(true); } var minX = Math.Min(road.StartNode.X, road.EndNode.X); var maxX = Math.Max(road.StartNode.X, road.EndNode.X); var minY = Math.Min(road.StartNode.Z, road.EndNode.Z); var maxY = Math.Max(road.StartNode.Z, road.EndNode.Z); var margin = 10.5f; if (minX - margin >= x && maxX + margin <= x && minY - margin >= y && maxY + margin <= y) { return(false); } else { return(true); } }
public Ets2NavigationRoute(Ets2Item start, Ets2Item end, Ets2Point from, Ets2Point to, Ets2Mapper mapper) { Start = start; End = end; From = from; To = to; Mapper = mapper; if (Start != End) { ThreadPool.QueueUserWorkItem(FindRoute); } }
private float RoadDistance(Ets2Item road, float x, float y) { if (road == null) { return(float.MaxValue); } if (road.StartNode == null || road.EndNode == null) { return(float.MaxValue); } if (Math.Abs(road.StartNode.X - x) > 500) { return(float.MaxValue); } if (Math.Abs(road.StartNode.Z - y) > 500) { return(float.MaxValue); } if (road.RoadPolygons == null) { road.GenerateRoadPolygon(64); } var minPerPoint = float.MaxValue; foreach (var pt in road.RoadPolygons) { var dx1 = pt.X - x; var dy1 = pt.Y - y; var r1 = (float)Math.Sqrt(dx1 * dx1 + dy1 * dy1); if (minPerPoint >= r1) { minPerPoint = r1; } } return(minPerPoint); }
public Ets2NavigationSegment(Ets2Item prefab) { Type = Ets2NavigationSegmentType.Prefab; Prefab = prefab; }
public Ets2Item FindItem(ulong uid) { if (uid == 0) return null; var pos = Stream.IndexesOfUlong(BitConverter.GetBytes(uid)); foreach (var off in pos) { var offs = off - 4; var type = BitConverter.ToUInt32(Stream, offs); if (type < 0x40 && type != 0) { var item = new Ets2Item(uid, this, offs); if (item.Valid) { return item; } } } return null; }